IP数据包解析代码.docx
- 文档编号:5734122
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:10
- 大小:54.61KB
IP数据包解析代码.docx
《IP数据包解析代码.docx》由会员分享,可在线阅读,更多相关《IP数据包解析代码.docx(10页珍藏版)》请在冰豆网上搜索。
IP数据包解析代码
IP数据包解析代码
#include
#include
#include
#include
#pragmacomment(lib,"Ws2_32.lib")
#defineBUFFER_SIZE65535
#defineFRAGMENT_SIZE10000//分片数据部分最长为10000
#defineFRAGMENT_NUM7
#defineSTART20
#defineIO_RCVALL_WSAIOW(IOC_VENDOR,1)
typedefstruct_IP_HEADER//定义IP头
{
BYTEVersion_HeadLen;//版本(前4位)和首部长度
BYTEServiceType;//服务类型
WORDTotalLen;//数据报总长
WORDID;//标识
*sum=(WORD)(~sum_tmp);
}
char*parseServiceType_getProcedence(BYTEb)
{
switch(b>>5)//获取服务类型字段中优先级子域
{
case7:
return"NetworkControl";//网络控制
break;
case6:
return"InternetworkControl";//网络控制
break;
case5:
return"CRITIC/ECP";
break;
case4:
return"FlashOverride";//最优先信号
break;
case3:
return"Flsah";
break;
case2:
return"Immediate";
break;
case1:
return"Priority";//协议
break;
case0:
return"Routine";//路由
break;
default:
return"Unknow";
break;
}
}
char*parseServiceType_getTOS(BYTEb)
{
b=(b>>1)&0x0f;//获取服务类型字段中的TOS子域
switch(b)
{
case0:
return"Normalservice";//正常运行
break;
case1:
return"Minimizemonetarycost";//成本
break;
case2:
return"Maximizereliability";//可靠性
break;
case4:
return"Maximizethroughput";//吞吐量
break;
case8:
return"Minimizedelay";//延迟
break;
case15:
return"Maximizesecurity";//安全性
break;
default:
return"Unknow";
}
}
char*getProtocol(BYTEProtocol)//获取协议字段共8位
{
switch(Protocol)//以下为协议号说明:
{
case1:
return"ICMP";//Internet控制报文协议
case2:
return"IGMP";//Internet组管理协议
case4:
return"IPinIP";//移动IP数据封装和隧道
case6:
return"TCP";//传输控制协议
case8:
return"EGP";//外部网关协议
case17:
return"UDP";//用户数据报文协议
case41:
return"IPv6";
case46:
return"RSVP";//资源预留协议
case89:
return"OSPF";//OpenShortestPathFirst开发式最短路径优先
default:
return"UNKNOW";
}
}
voidipparse(FILE*file,IP_HEADER*ip_pointer)
{
fseek(file,0,SEEK_END);
fprintf(file,"版本号=%d\r\n",ip_pointer->Version_HeadLen>>4);
fprintf(file,"报头标长=%d(BYTE)\r\n",((ip_pointer->Version_HeadLen&0x0f)*4));//首部长度是以4个字节为单位的
fprintf(file,"服务器类型=%s,%s\r\n",parseServiceType_getProcedence(ip_pointer->ServiceType),
parseServiceType_getTOS(ip_pointer->ServiceType));
fprintf(file,"总长度=%d(BYTE)\r\n",ip_pointer->TotalLen);
fprintf(file,"标识=%d\r\n",ip_pointer->ID);
fprintf(file,"标志位DF=%d,MF=%d\r\n",((ip_pointer->Flags_FragOff>>14)&0x01),((ip_pointer->Flags_FragOff>>13)&0x01));
fprintf(file,"分段偏移值=%d\r\n",(ip_pointer->Flags_FragOff&0x1fff));
fprintf(file,"生存期=%d(hops)\r\n",ip_pointer->TimeToLive);
fprintf(file,"协议=%s\r\n",getProtocol(ip_pointer->Protocol));
fprintf(file,"头校验和=0x%0x\r\n",ip_pointer->HdrChksum);
fprintf(file,"源IP地址=%s\r\n",inet_ntoa(*(in_addr*)&ip_pointer->SrcAddr));
fprintf(file,"目的IP地址=%s\r\n",inet_ntoa(*(in_addr*)&ip_pointer->DstAddr));
fprintf(file,"---------------------------------------------\r\n");
}
voidassisgment(IP_HEADER*sou_pointer,IP_HEADER*des_pointer)
{
des_pointer->Version_HeadLen=sou_pointer->Version_HeadLen;
des_pointer->ServiceType=sou_pointer->ServiceType;
des_pointer->TotalLen=sou_pointer->TotalLen;
des_pointer->ID=sou_pointer->ID;
des_pointer->TimeToLive=sou_pointer->TimeToLive;
des_pointer->Protocol=sou_pointer->Protocol;
des_pointer->SrcAddr=sou_pointer->SrcAddr;
des_pointer->DstAddr=sou_pointer->DstAddr;
}
voidmain()
{
FILE*file;
file=fopen("分片数据报头.txt","wb+");
WORDrv;
WSADATAWSAData;//定义了能够储存WSAStarup调用返回值的结构
rv=MAKEWORD(2,2);//Winsock2版本
WSAStartup(rv,&WSAData);
SOCKETsock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);//创建套接字,sock为套接字描述符
BOOLflag=true;
setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag,sizeof(flag));//任意类型、任意状态套接口的设置选项值
charhostName[128];
gethostname(hostName,100);//获取主机名
hostent*pHostIP;//获取本地IP地址
pHostIP=gethostbyname(hostName);
sockaddr_inaddr_in;
addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_list[0];
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(6000);//将无符号短整型主机数据转换为网络字节顺序数据
bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in));
DWORDdwBufferLen[10];//设置网卡为混杂模式
DWORDdwBufferInLen=1;
DWORDdwBytesReturned=0;
WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),
&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);
charbuffer[BUFFER_SIZE];//设置缓冲区
intn=0;//n是一个标志用来使得输出更加调理
charc;
do{
system("cls");
IP_HEADERfragment_Header[FRAGMENT_NUM];
intsize=recv(sock,buffer,BUFFER_SIZE,0);//接收数据包
IP_HEADERip=*(IP_HEADER*)buffer;
intfragment_num=(ip.TotalLen-(ip.Version_HeadLen&0x0f)*4)/FRAGMENT_SIZE+1;
printf("\n\n接受到IP数据报的报头信息是\n");
if(size>0)
{
ipparse(file,&ip);
ipparse(stdout,&ip);
printf("\n\nIP数据报分片\n");
printf("---------------------------------------------\n");
for(intj=0;j { assisgment(&ip,&fragment_Header[j]); //对总长度标志位和页偏移赋值 unsignedshortflags_flagoff; unsignedshorttotal_len; WORDcs; if(j! =fragment_num-1) { flags_flagoff=j*FRAGMENT_SIZE/8+(short)8192;//8192对应的是标志位的MF total_len=FRAGMENT_SIZE+(unsignedshort)((ip.Version_HeadLen&0x0f)*4); } else { flags_flagoff=j*FRAGMENT_SIZE/8; total_len=ip.TotalLen%FRAGMENT_SIZE+(unsignedshort)((ip.Version_HeadLen&0x0f)*4); } fragment_Header[j].Flags_FragOff=(WORD)flags_flagoff; fragment_Header[j].TotalLen=total_len; fragment_Header[j].HdrChksum=0; //checksum(fragment_Header[j],checksum); checksum(&fragment_Header[j],&cs); fragment_Header[j].HdrChksum=cs; ipparse(file,&fragment_Header[j]); ipparse(stdout,&fragment_Header[j]); } fflush(stdin); cout<<"是否继续捕捉数据报? (Y/N)"< do cin>>c; while(c! ='n'&&c! ='N'&&c! ='y'&&c! ='Y'); } else cout<<"捕获数据失败"< }while(c=='y'||c=='Y'); fclose(file); closesocket(sock); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IP 数据包 解析 代码