计算机网络程序设计实验8.docx
- 文档编号:25040085
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:15
- 大小:33.32KB
计算机网络程序设计实验8.docx
《计算机网络程序设计实验8.docx》由会员分享,可在线阅读,更多相关《计算机网络程序设计实验8.docx(15页珍藏版)》请在冰豆网上搜索。
计算机网络程序设计实验8
北京联合大学信息学院
《网络程序设计》
实验报告
实验序号:
姓名:
学号:
班级:
专业:
实验八、基于原始套接字SOCK_RAW实现数据提取分析
实验代码
#include
#include
#include
#include
#include
#include
#include
#pragmacomment(lib,"ws2_32.lib")
#defineSIO_RCVALL_WSAIOW(IOC_VENDOR,1)
usingnamespacestd;
typedefstruct
{
u_charhl:
4,/*头部长度,是little‐endian,所以hl在前*/version:
4;/*版本*/
u_chartos;/*服务类型*/
u_shortlength;/*包长*/
u_shortid;/*标识*/
u_shortfragment;/*分段*/
u_charTTL;/*生存期*/
u_charprotocol;/*下一个头的协议*/
u_shortchksum;/*检验和*/
IN_ADDRsource;/*源地址*/
IN_ADDRdest;/*目的地址*/
}IP_HEADER;
typedefstruct
{
u_chartype;//icmpservicetype,8echorequest,0echoreply
u_charcode;//icmpheadercode
u_shortchksum;//icmpheaderchksum
u_shortid;//icmppacketidentification?
u_shortseq;//icmppacketsequent
}ICMP_HEADER;
char*version(u_charid)
{
id=id>>4;
if((int)id==4)
return"ipv4";
else
{
if((int)id==6)
return"ipv6";
}
return"unknown";
}
intheadlenth(u_charid)
{
id=id<<4;
id=id>>4;
return((int)id)*4;
}
intTCPheadlenth(u_charid)
{
id=id>>4;
return((int)id)*4;
}
voidservices(string&str,u_charid)
{
stringstreambuffer;
buffer< buffer>>str;//从内存写入double buffer.clear();//释放内存 } inttotallenth(u_charidfisrt,u_charidsecond) { intlenth; lenth=(int)idsecond+((int)idfisrt)*256; returnlenth; } intttl(u_charid) { return(int)id; } char*protocol(u_charid) { switch(id) { case1: return"ICMP"; case2: return"IGMP"; case4: return"IPinIP"; case6: return"TCP"; case8: return"EGP"; case17: return"UDP"; case41: return"IPv6"; case46: return"RSVP"; case89: return"OSPF"; default: return"unknown"; } } voidintToString(string&str,intx) { stringstreambuffer; buffer< buffer>>str;//从内存写入double buffer.clear();//释放内存 } voidaddress(string&address,u_charid1,u_charid2,u_charid3,u_charid4) { stringtem; address=""; intToString(tem,(int)id1); address=address+tem+"."; intToString(tem,(int)id2); address=address+tem+"."; intToString(tem,(int)id3); address=address+tem+"."; intToString(tem,(int)id4); address=address+tem; } inttwochartoint(u_charid1,u_charid2) { inttem; tem=((int)id1)*256+(int)id2; returntem; } intfournetchartoint(u_charid1,u_charid2,u_charid3,u_charid4) { inttem; tem=((int)id1)*256*256*256+((int)id2)*256*256+((int)id3)*256+(int)id4; returntem; } intTCPURG(u_charid) { inttem; id=id<<2; id=id>>7; tem=(int)id; returntem; } intTCPACK(u_charid) { inttem; id=id<<3; id=id>>7; tem=(int)id; returntem; } intTCPPSH(u_charid) { inttem; id=id<<4; id=id>>7; tem=(int)id; returntem; } intTCPRST(u_charid) { inttem; id=id<<5; id=id>>7; tem=(int)id; returntem; } intTCPSYN(u_charid) { inttem; id=id<<6; id=id>>7; tem=(int)id; returntem; } intTCPFIN(u_charid) { inttem; id=id<<7; id=id>>7; tem=(int)id; returntem; } intMFflag(u_charid) { id=id<<2; id=id>>7;//是三位中的最低位 return(int)id; } intDFflag(u_charid) { id=id<<1; id=id>>7;//是三位中的中间位 return(int)id; } intoffset(u_charid1,u_charid2) { inttem; id1=id1<<3; id1=id1>>3; tem=((int)id1)*256+(int)id2; returntem; } intmain(intargc,char*argv[]) { IP_HEADER*IpHdr;//IP包头 ICMP_HEADER*IcmpHdr;//IP包头 WSADATAwsData; if(WSAStartup(MAKEWORD(2,2),&wsData)! =NULL)//初始化winsockDLL { cout<<"初始化winsock库失败! "< exit(-1); } SOCKETsock; sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);//建立rawsocket if(sock==INVALID_SOCKET) { cout<<"创建套接字失败! "< exit(-1); } charhostName[128]; gethostname(hostName,128);//获取本机IP地址 hostent*pHostIP; pHostIP=gethostbyname(hostName); sockaddr_inlocalAddr; localAddr.sin_family=AF_INET;//填充sockaddr_in结构体 localAddr.sin_port=NULL; localAddr.sin_addr=*(in_addr*)pHostIP->h_addr; if(bind(sock,(sockaddr*)&localAddr,sizeof(structsockaddr))==SOCKET_ERROR)//套接字绑定 { cout<<"绑定套接字失败! "< exit(-1); } DWORDvalue=1; ioctlsocket(sock,SIO_RCVALL,&value); charbuffer[65535]={0};//创建接收缓冲区 time_tbegin=time(NULL); cout<<"监听......"< intsize=0; ofstreamfout("201108033232711.txt");//以输出方工打开文件 if(! fout)//判断输入输出流是否为空 { cout<<"文件为空"; getchar(); exit(0); } inti=0; while(true) { size=recv(sock,buffer,65535,0); if(size>0) { IpHdr=(IP_HEADER*)buffer; IcmpHdr=(ICMP_HEADER*)(&buffer[IpHdr->hl*4]); stringversion1; version1=version(buffer[0]); intheadlenth1; headlenth1=headlenth(buffer[0]); inttotallenth1; totallenth1=totallenth(buffer[2],buffer[3]); intttl1; ttl1=ttl(buffer[8]); stringprotocol1; protocol1=protocol(buffer[9]); stringsourceaddress; address(sourceaddress,buffer[12],buffer[13],buffer[14],buffer[15]); stringdestinationaddress; address(destinationaddress,buffer[16],buffer[17],buffer[18],buffer[19]); chara[5];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 网络程序设计 实验