计算机网络课程设计
return \ default: return \ } }
void ipparse(FILE* file,char* buffer) {
IP_HEADER ip=*(IP_HEADER*)buffer; //通过指针把缓冲区的内容强制转化为IP_HEADER数据结构
fseek(file,0,SEEK_END); BYTE version;
getVersion(ip.Version,version);
fprintf(file,\版本号=%d\\r\\n\ BYTE headerLen;
getIHL(ip.HdrLen,headerLen);
fprintf(file,\报头标长=%d(BYTE)\\r\\n\ fprintf(file,\服务类型=%s,%s\\r\\n\
parseServiceType_getProcedence(ip.ServiceType), parseServiceType_getTOS(ip.ServiceType)); fprintf(file,\总长度=%d(BYTE)\\r\\n\ fprintf(file,\标识=%d\\r\\n\ BYTE DF,MF;
getFlags(ip.Flags,DF,MF);
fprintf(file,\标志 DF=%d,MF=%d\\r\\n\ WORD fragOff;
getFragOff(ip.FragOff,fragOff);
fprintf(file,\分段偏移值=%d\\r\\n\
fprintf(file,\生存期=%d(hopes)\\r\\n\ fprintf(file,\协议=%s\\r\\n\ fprintf(file,\头校验和=0x%0x\\r\\n\
fprintf(file,\源IP地址=%s\\r\\n\
fprintf(file,\目的IP地址=%s\\r\\n\ fprintf(file,\}
int main(int argc,char* argv[]) { if(argc !=2) { printf(\ return -1; }
FILE * file; if((file=fopen(argv[1],\
- 10 -
计算机网络课程设计
{ printf(\ return -1; }
WSADATA wsData;
if(WSAStartup(MAKEWORD(2,2),&wsData)!=0) { printf(\ return -1; }
//建立套接字 SOCKET sock;
if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET) { printf(\ return -1; }
BOOL flag=TRUE;
//设置IP头操作选项,用户可对IP头处理
if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag))==SOCKET_ERROR) { printf(\ return -1; }
char hostName[128];
if(gethostname(hostName,100)==SOCKET_ERROR) { printf(\ return -1; }
//获取本地地址 hostent * pHostIP;
if((pHostIP=gethostbyname(hostName))==NULL) { printf(\ return -1; }
//填充SOCKADDR_IN结构 sockaddr_in addr_in;
addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_list[0]; addr_in.sin_family=AF_INET; addr_in.sin_port=htons(6000);
if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in))==SOCKET_ERROR) {
- 11 -
计算机网络课程设计
printf(\ return -1; }//把socket绑定到本地网卡 DWORD dwValue=1; //设置SOCK_RAW为SIO_RCVALL,能接收所有IP包 #define IO_RCVALL _WSAIOW(IOC_VENDOR,1) DWORD dwBufferLen[10]; DWORD dwBufferInLen=1; DWORD dwBytesReturned=0; if(WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)==SOCKET_ERROR) { printf(\ return -1; } //设置接受数据包缓冲区长度 #define BUFFER_SIZE 65535 char buffer[BUFFER_SIZE]; //监听网卡
printf(\开始解析经过本机的IP数据包:\\n\ while(true) { int size=recv(sock,buffer,BUFFER_SIZE,0); if (size>0) { ipparse(stdout,buffer); ipparse(file,buffer); } } fclose(file); return 0; }
- 12 -
计算机网络课程设计
课程设计成绩评定表
学生姓名 专业班级 设计题目 IP数据报解析源地址/目的地址 指导教师评语及意见: 指导教师评阅成绩: 指导教师签字: 年 月 日
- 13 -