计算机网络课程设计报告-解析Ethernet ARP 数据包_第1页
计算机网络课程设计报告-解析Ethernet ARP 数据包_第2页
计算机网络课程设计报告-解析Ethernet ARP 数据包_第3页
计算机网络课程设计报告-解析Ethernet ARP 数据包_第4页
计算机网络课程设计报告-解析Ethernet ARP 数据包_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机网络课程设计报告题目:解析EthernetARP数据包问题描述通过编制程序,获取网络中的ARP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。程序的具体要求如下所示:1,以命令行的形式运行,如下所示:arparp.log其中,arp为程序名arp.log为日志文件名。2,程序输出内容如下所示:源IP地址源MAC地址目的IP地址目的MC地址操作时间各部分的说明如下所示:源IP地址:输出ARP消息格式中的源IP地址字段源MAC地址:输出ARP消息格式中的源物理地址字段目的IP地址:输出ARP消息格式中的目的IP地址字段目的MAC地址:输出ARP消息格式中的目的物理地址字段操作:输出ARP消息格式中的操作字段,若为ARP请求,则为1,若为ARP应答,则为2,时间:该ARP包产生的时间3,当程序接收到键盘输入Ctrl+C时字段退出。概要设计首先取得当前网卡设备列表,利用PCAP提供的PCAP_findalldevs()函数实现此功能.其次选择Ethernet网卡并打开,注意判断所选网卡是否为实际存在的可用网卡。然后设置过滤器,使其只捕获ARP包.过滤函数PCAP_complie和PCAP_setfilter.设置函数为PCAP_setfilter().最后捕获数据包并进行处理(包括输出各IP地址,物理地址,操作类型以及时间)。由于要记录日志文件,为了便于输出流参数,使pcap_next_ex()函数。ARP数据结构及流程图如下。ARP数据包结构structarppkt{unsignedshorthdtyp;//硬件地址值0001表示其为Ethernet unsignedshortprotyp;/协议类型值0800表示上层协议为IP unsignedcharhdsize;//硬件地址长度 unsignedcharprosize;//协议地址长度 unsignedshortop;//操作值 u_charsmac[6];//源MAC地址 u_charsip[4];//源IP地址 u_chardmac[6];//目的MAC地址 u_chardip[4];//目的IP地址};详细设计voidpacket_handler(constpcap_pkthdr*header,constu_char*pkt_data,ostream&);voidmain(){ char*argv="arp.log"; pcap_if_t*alldevs;//网络设备结构 pcap_if_t*d; pcap_t*adhandle; charerrbuf[PCAP_ERRBUF_SIZE];//错误信息 u_intnetmask;//子网掩码 charpacket_filter[]="etherproto\\arp";//过滤,选择ARP协议 structbpf_programfcode; structpcap_pkthdr*header; constu_char*pkt_data; //获取本机网卡列表 if(pcap_findalldevs(&alldevs,errbuf)==-1) { cout<<"Errorinpcap_findalldevs:"<<errbuf; return; } inti=0; cout<<"本机网卡列表如下:"<<endl; //打印网卡列表 for(d=alldevs;d!=NULL;d=d->next) { printf("%d.%s",++i,d->name); if(d->description) printf("(%s)\n",d->description); else printf("(没有可用的网络设备)\n"); } if(i==0) { printf("\nNointerfacesfound!MakesureWinPcapisinstalled.\n"); return; } //选择一个Ethernetka卡 intinum; printf("Entertheinterfacenumber(1-%d):",i); scanf("%d",&inum);for(;inum<1||inum>i;) { printf("\nInterfacenumberoutofrange.\n"); printf("Pleaseinput'Ctrl+C'finishthisoperationOr\nEntertheinterfacenumber(1-%d):",i); scanf("%d",&inum); } //跳转到选中的适配器 for(d=alldevs,i=0;i<inum-1;d=d->next,i++); //以混杂模式打开网卡,接受所有的帧 if((adhandle=pcap_open_live(d->name,1000,1,300,errbuf))==NULL) { cout<<"\nUnabletoopentheadapter."; pcap_freealldevs(alldevs);//释放设备列表 return; } if(!(pcap_datalink(adhandle)==DLT_EN10MB&&d->addresses!=NULL))//检查数据链路是否为Ethernet(DLT_EN10MB) { cout<<"Error"<<endl; return; } //获得子网掩码 netmask=((sockaddr_in*)(d->addresses->netmask))->sin_addr.S_un.S_addr; //调试过滤器,只捕获ARP包 if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0) { cout<<"\nUnabletocompilethepacketfilter.Checkthesyntax.\n"; pcap_freealldevs(alldevs); return; } //设置过滤器 if(pcap_setfilter(adhandle,&fcode)<0) { cout<<"\nErrorsettingthefilter.\n"; pcap_freealldevs(alldevs); return; } cout<<"\t\tlisteningon"<<d->description<<"..."<<endl<<endl; ofstreamfout(argv,ios::app);//日志记录文件 //加入日期记录 time_tt; time(&t); fout.seekp(0,ios::end); if(int(fout.tellp())!=0) fout<<endl; fout<<"\t\tARPrequest(1)/replay(2)on"<<ctime(&t); cout<<"sourIPAddr"<<""<<"SourMACAddress" <<""<<"DesIPAddr"<<""<<"DesMACAddress" <<""<<"OP"<<""<<"Time"<<endl; fout<<"SourIPAddr"<<""<<"SourMACAddress" <<""<<"DesIPAddr"<<""<<"DesMACAddress" <<""<<"OP"<<""<<"Time"<<endl; //释放设备列表 pcap_freealldevs(alldevs); //开始捕获MAC帧 intresult;//时间到返回结果 while((result=pcap_next_ex(adhandle,&header,&pkt_data))>=0) { if(result==0) continue; packet_handler(header,pkt_data,cout);//解析ARP包,输出结果 packet_handler(header,pkt_data,fout);//输出到文件 }}voidpacket_handler(constpcap_pkthdr*header,constu_char*pkt_data,ostream&out){ inti; //从截获的数据帧中找到arp包头的位置 arppkt*arph=(arppkt*)(pkt_data+14);//14为Ethernet帧头的长度 //输出源IP地址 for(i=0;i<3;i++) out<<int(arph->sip[i])<<'.'; out.setf(ios::left); out<<setw(3)<<int(arph->sip[3])<<""; out.unsetf(ios::left); //输出源MAC地址 charoldfillchar=out.fill('0'); out.setf(ios::uppercase);//MAC地址以分开'-'的大写字符表示 for(i=0;i<5;i++) out<<hex<<setw(2)<<int(arph->smac[i])<<'_'; out<<hex<<setw(2)<<int(arph->smac[5])<<""; out.fill(oldfillchar); //输出目的的IP地址 out.unsetf(ios::hex|ios::uppercase); for(i=0;i<3;i++) out<<int(arph->dip[i])<<'.'; out.setf(ios::left); out<<setw(3)<<int(arph->dip[3])<<""; out.unsetf(ios::left); //输出目的MAC地址 out.fill('0'); out.setf(ios::uppercase); for(i=0;i<5;i++) out<<hex<<setw(2)<<int(arph->dmac[i])<<'_'; out<<hex<<setw(2)<<int(arph->dmac[5])<<""; out.fill(oldfillchar); out.unsetf(ios::hex|ios::uppercase); out<<ntohs(arph->op)<<"";//输出的操作类型,注意网络字节间的转换 structtm*ltime;//时间longtime=(long)header->ts.tv_sec; ltime=localtime(&time); out.fill('0'); out<<ltime->tm_hour<<':'<<setw(2)<<ltime->tm_min<<':'<<setw(2)<<ltime->tm_sec; out.fill(oldfillchar); out<<endl;}调试分析在最开始运行该程序时,出现了很多问题。比如:没有正确的导入本程序所需要的数据库;重复定义一个变量;运行界面不够美观。对于没能正确导入数据库,我们充分发挥了网络的功能,下载、安装并导入了数据库。将程序改动后,重复定义变量和运行界面不够美观的问题也解决了。五、心得体会本次课程设计,完成了解析ARP数据包的编写。在此期间我们查阅了大量的案例,学到了很多知识,使我们对计算机网络有了更深入的了解。在具体实现获取网络中的ARP数据包解析数据包的内容,并将其写入日志文件的过程中,是我们更加清楚物理地址、IP地址的关联,源地址与目的地址的关系,以及二者对数据类型的格式要求。最重要的是通过这次的实际训练让我们对ARP协议更加理解。课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论