计算机网络课程设计实验报告_第1页
计算机网络课程设计实验报告_第2页
计算机网络课程设计实验报告_第3页
计算机网络课程设计实验报告_第4页
计算机网络课程设计实验报告_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

PAGEPAGE1实验报告课程名称 计算机网络课程设计 报告名称 计算机网络课程设计实验报告班级 物联11 学号 姓名 课题一:发送ARP数据包1、实验目的和要求1.1实验目的(1)熟悉ARP协议的原理;(2)熟悉ARP协议的分组结构;(3)熟悉WinCap中的Packet编程;(4)熟悉截包软件的使用。1.2实验要求编写程序,构造ARP包,选择并打开网卡,将ARP包发送出去并用截包软件验证。(1)程序使用VisualC++编写,可建立Win32ConsoleApplication工程;(2)程序用命令行方式使用,命令行要求有6个参数,可按如下命令方式使用:程序名源IP源MAC目标IP目标MAC标志网卡号其中标志参数:1表示请求,2表示应答。(3)在ARP填充数据字段填入自己的姓名的拼音;(4)用安装的截包软件能够捕获到本程序发出的ARP包。2、实验环境2.1硬件环境PC机一台2.2软件环境操作系统:WindowsXP开发语音:C、C++运行环境:MicrosoftVisualC++6.0函数库:WinPcap4.0.1(Packet.dll)截包软件:Ethereal程序逻辑框图程序源代码#include<stdafx.h>#include<iostream.h>#include<fstream.h>#include<conio.h>#include<stdio.h>#include<stdlib.h>#include"Packet32.h"#include"Ntddndis.h"#include<string.h>#pragmacomment(lib,"Packet.lib")#pragmacomment(lib,"ws2_32.lib")//DLC头typedefstructDLCHeader{unsignedcharDesMAC[6];unsignedcharSrcMAC[6];unsignedshortEthertype;}DLCHEADER;//ARP桢typedefstructARPFrame{unsignedshortHW_Type;unsignedshortProt_Type;unsignedcharHW_Addr_Len;unsignedcharProt_Addr_Len;unsignedshortFlag;//1=request,2=responseunsignedcharSend_HW_Addr[6];unsignedcharSend_Prot_Addr[4];unsignedcharTarg_HW_Addr[6];unsignedcharTarg_Prot_Addr[4];unsignedcharpadding[18];}ARPFRAME;//ARP包=DLC头+ARP桢typedefstructARPPacket{DLCHeaderdlcHeader;ARPFramearpFrame;}*PARPPACKET;ARPPacketARPPACKET;inttransIP(char*,unsignedchar*);inttransMAC(char*,unsignedchar*);LPADAPTERlpAdapter;LPPACKETlpPacket;boolSend();voidmain(intargc,char*argv[]){if(argc!=6){cout<<"输入格式错误"<<endl;return;}inti=0;memset(&ARPPACKET,0,sizeof(ARPPACKET));if(*argv[5]=='0'){for(i=0;i<6;i++)ARPPACKET.dlcHeader.DesMAC[i]=0xff;ARPPACKET.arpFrame.Flag=(unsignedshort)0x0100;}else{if(*argv[5]=='1'){//填充DLC头中目的MAC地址if(!transMAC(argv[4],ARPPACKET.dlcHeader.DesMAC))return;//ARP桢中flag位置2ARPPACKET.arpFrame.Flag=(unsignedshort)0x0200;}elsecout<<"flag位输入错误"<<endl;}if(!transMAC(argv[2],ARPPACKET.dlcHeader.SrcMAC))return;//填充DLC头中桢类型ARPPACKET.dlcHeader.Ethertype=htons((unsignedshort)0x0806);ARPPACKET.arpFrame.HW_Type=(unsignedshort)0x0100;//(Ethernet类型)ARPPACKET.arpFrame.Prot_Type=(unsignedshort)0x0008;ARPPACKET.arpFrame.HW_Addr_Len=(unsignedchar)6;ARPPACKET.arpFrame.Prot_Addr_Len=(unsignedchar)4;if(!transMAC(argv[2],ARPPACKET.arpFrame.Send_HW_Addr))return;if(!transIP(argv[1],ARPPACKET.arpFrame.Send_Prot_Addr))return;if(!transMAC(argv[4],ARPPACKET.arpFrame.Targ_HW_Addr))return;if(!transIP(argv[3],ARPPACKET.arpFrame.Targ_Prot_Addr))return;for(i=3;i<18;i++)ARPPACKET.arpFrame.padding[i]=0;ARPPACKET.arpFrame.padding[0]='w';ARPPACKET.arpFrame.padding[1]='a';ARPPACKET.arpFrame.padding[2]='n';ARPPACKET.arpFrame.padding[3]='g';ARPPACKET.arpFrame.padding[4]='j';ARPPACKET.arpFrame.padding[5]='i';ARPPACKET.arpFrame.padding[6]='n';ARPPACKET.arpFrame.padding[7]='q';ARPPACKET.arpFrame.padding[8]='u';ARPPACKET.arpFrame.padding[9]='a';ARPPACKET.arpFrame.padding[10]='n';if(!Send())cout<<"发送arp包失败"<<endl;}inttransIP(char*argv,unsignedchar*a){charip[16];inti=0,j=0,k=0;strcpy(ip,argv);intm=strlen(argv);for(i=0;i<m;i++)//判断命令行输入的IP格式是否正确{if((ip[i]<'0'||ip[i]>'9')&&ip[i]!='.'){cout<<"输入ip:"<<argv<<"格式错误"<<endl;return0;}else{if(ip[i]!='.')j++;else{k++;if(j>3){cout<<"输入ip:"<<argv<<"格式错误"<<endl;return0;}else{j=0;}if(k>3){cout<<"输入ip:"<<argv<<"格式错误"<<endl;return0;}}}}j=0;for(i=0;i<4;i++)//填充IP地址{while(*(ip+j)<'0'||*(ip+j)>'9')j++;a[i]=(unsignedchar)atoi(ip+j);while(*(ip+j)>='0'&&*(ip+j)<='9')j++;}return1;}inttransMAC(char*argv,unsignedchar*b){charmac[18];inti=0,j=0,k=0;strcpy(mac,argv);intm=strlen(argv);for(i=0;i<m;i++)//判断命令行输入的MAC地址是否正确{if(mac[i]<'0'||(mac[i]>':'&&mac[i]<'A')||(mac[i]>'Z'&&mac[i]<'a')||mac[i]>'Z'){cout<<"输入mac:"<<argv<<"格式错误"<<endl;return0;}else{if(mac[i]!=':')j++;else{k++;if(j>2){cout<<"输入mac"<<argv<<"格式错误"<<endl;return0;}else{j=0;}if(k>5){cout<<"输入mac"<<argv<<"格式错误"<<endl;return0;}}}}j=0;for(i=0;i<6;i++)//填充MAC地址{ while(*(mac+j)==':'||*(mac+j)=='-')j++;if(*(mac+j)>='0'&&*(mac+j)<='9')b[i]=(unsignedchar)(*(mac+j)-'0');if(*(mac+j)>='a'&&*(mac+j)<='z')b[i]=(unsignedchar)(*(mac+j)-'a'+10);if(*(mac+j)>='A'&&*(mac+j)<='z')b[i]=(unsignedchar)(*(mac+j)-'A'+10);j++;b[i]*=16;if(*(mac+j)>='0'&&*(mac+j)<='9')b[i]+=(unsignedchar)(*(mac+j)-'0');if(*(mac+j)>='a'&&*(mac+j)<='z')b[i]+=(unsignedchar)(*(mac+j)-'a'+10);if(*(mac+j)>='A'&&*(mac+j)<='z')b[i]+=(unsignedchar)(*(mac+j)-'A'+10);j++;}return1;}boolSend(){charAdapterNameA[8192];charAdapterNameU[2*sizeof(AdapterNameA)];unsignedlongAdapterAlength=sizeof(AdapterNameA);unsignedlongAdapterUlength=2*sizeof(AdapterNameA);DWORDdwVersion=GetVersion();DWORDdwWindowsMajorVersion=(DWORD)(LOBYTE(LOWORD(dwVersion)));if(!(dwVersion>=0x80000000&&dwWindowsMajorVersion>=4)){//WindowsNT//获取UNICODE码网卡名列表if(PacketGetAdapterNames(AdapterNameU,&AdapterUlength)==FALSE){cout<<"cannotgetadapterlist"<<endl;returnFALSE;}//将第一个网卡名转为ASCII码unsignedshort*pAdapterName=(unsignedshort*)AdapterNameU;for(unsignedi=0;i<AdapterAlength;i++)if((AdapterNameA[i]=(char)pAdapterName[i])=='\0')break;}else{//Windows9x//获取ASCII码网卡名列表if(PacketGetAdapterNames(AdapterNameA,&AdapterAlength)==FALSE){cout<<"cannotgetadapterlist"<<endl;returnFALSE;}}inti; for(i=1;i<8000;i++)AdapterNameA[i]=AdapterNameU[i+33];lpAdapter=PacketOpenAdapter(AdapterNameA);if(!lpAdapter||lpAdapter->hFile==INVALID_HANDLE_VALUE){cout<<"Cannotopenadapter.errorcode:"<<GetLastError()<<endl;returnFALSE;}//发送包:LPPACKETlpPacket;//定义发送包指针if((lpPacket=PacketAllocatePacket())!=NULL){//初始化发送包结构PacketInitPacket(lpPacket,&ARPPACKET,sizeof(ARPPACKET));//每次只发送一个包PacketSetNumWrites(lpAdapter,1);//发送包if(PacketSendPacket(lpAdapter,lpPacket,true)==1){cout<<"Sendsuccessfully"<<endl;}else{cout<<"Sendfail"<<endl;PacketFreePacket(lpPacket);//释放发送包结构}}else{cout<<"FailedallocatingLPPACKET"<<endl;}PacketCloseAdapter(lpAdapter);returnTRUE;}实验数据、结果分析打开Ethereal进行抓包,然后调试程序,运行成功。本机IP:37MAC地址:88:51:FB:6F:0A:A1ARP请求打开程序,设置程序变量为3788:51:FB:6F:0A:A103FF:FF:FF:FF:FF:FF0截图如下:ARP应答向教师机发送请求后收到应答,截图如下6、总结通过此次实验,让我们重新温习了使用VC++6.0进行编程的流程,提高了我们用C语言进行编程的能力。以前对于ARP的认识仅仅停留在课本知识的层次,这次的实际操作,加深了我们对于ARP包的了解,对ARP协议帧结构和它的工作原理有了更深的认识。通过实验,我们也了解了WinPcap中一些数据结构和函数说明,并且学会了如何使用Ethereal进行抓包,并在其中筛选出想要的结果。此外,通过这次实验,也锻炼了我们的思考能力和合作能力。在编程的过程中,遇到了很多的困难,只有静下心来,仔细思考,逐步调试,才能找出代码存在的问题。有的问题很棘手,自己难以解决,通过和同学们互相讨论,加强了合作能力,也促进了问题的解决。同时,特别感谢老师在实验过程中的悉心指导。课题二:解析ARP与IP数据包1、实验目的和要求1.1、实验目的(1)熟悉ARP与IP协议的原理;(2)熟悉ARP与IP协议的分组结构,对网络协议有更好的理解与认识;(3)熟悉WinCap编程;1.2、实验要求编写程序,获取网络中的ARP包和IP包,解析数据包的内容,显示各包的主要字段和接收时间。(1)程序使用VisualC++编写,可建立Win32ConsoleApplication工程;(2)程序用命令行方式使用,命令行要求有1个参数,可按如下命令方式使用:程序名网卡号(3)程序输出的内容可参考如下格式:SourceIPSourceMac/HeadLenDestIPDestMac/TotalLenFlag/ProtocolTimeType其中,Flag是对ARP而言的(1为请求,2为应答);Type表示包的类型(ARP或IP,或者用代码表示);HeadLen、TotalLen和Protocol是对IP而言的。(4)程序接收到键盘输入Ctrl+C时退出。2、实验环境2.1硬件环境PC机一台2.2软件环境操作系统:WindowsXP开发语音:C、C++运行环境:MicrosoftVisualC++6.0函数库:WinPcap4.0.1(Packet.dll)截包软件:Ethereal3、程序逻辑框图4、程序源代码#include<conio.h>#include<fstream.h>#include<iomanip.h>#include<pcap.h>#include<winsock2.h>#pragmacomment(lib,"ws2_32.lib")#pragmacomment(lib,"wpcap.lib")//定义ARP包数据structarppkt{ unsignedshorthdtyp;//硬件类型 unsignedshortprotyp;//协议类型 unsignedcharhdsize;//硬件地址长度 unsignedcharprosize;//协议地址长度 unsignedshortop;//(操作类型)操作值:ARP/RARP 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&out){//从ARP包中找到头部位置arppkt*arph=(arppkt*)(pkt_data+14); //输出源IP地址for(inti=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);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);out.unsetf(ios::hex|ios::uppercase); //输出目的IP地址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; ltime=localtime(&header->ts.tv_sec); out.fill('0'); out<<ltime->tm_hour<<':'<<setw(2)<<ltime->tm_min<<':'<<setw(2)<<ltime->tm_sec; out.fill(oldfillchar); out<<endl;}voidmain(intargc,char*argv[])//命令行参数{ //初始化网络设备相关参数 pcap_if_t*alldevs; pcap_if_t*d; pcap_t*adhandle; charerrbuf[PCAP_ERRBUF_SIZE]; u_intnetmask; charpacket_filter[]="etherproto\\arp"; structbpf_programfcode; structpcap_pkthdr*header; constu_char*pkt_data; //获取网络设备列表 if(pcap_findalldevs(&alldevs,errbuf)==-1) { cout<<"Errorinpcap_findalldevs:"<<errbuf; return; } //选取一个Ethernet网卡 for(d=alldevs;d;d=d->next) { // 网卡设为混杂模式,接收所有帧 if((adhandle=pcap_open_live(d->name,1000,1,300,errbuf))==NULL) { cout<<"\nUnabletoopentheadapter."; pcap_freealldevs(alldevs); return; } //检查数据链路是否为Ethernet if(pcap_datalink(adhandle)==DLT_EN10MB&&d->addresses!=NULL) break; }if(d==NULL){cout<<"\nNointerfacesfound!MakesureWinpcapisinstalled.\n";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

温馨提示

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

评论

0/150

提交评论