使用ARP协议获取局域网内部活动主机物理地址的程序实现(C++)(广工2012计算机网络课程设计)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

课程设计课程名称计算机网络_题目名称______________________学生学院_____计算机学院_______专业班级____学号学生姓名指导教师_______2013年1月11日计算机网络课程设计一、设计题目使用ARP协议获取局域网内部活动主机物理地址的程序实现(C++)二、已知技术参数和设计要求1.已知参数:选择适当的网络适配器,以绑定Winpcap。2.设计要求:2.1协议实现需要哪些数据帧?注意要数据帧的定义要符合公共标准。2.2如何实现实现数据帧的发送?2.3如何接收及解析目的主机的响应数据帧?2.4如何显示ARP协议的执行结果?3.C++环境为VisualC++三、设计内容与步骤1.熟悉ARP协议的工作原理;2.熟悉ARP协议相关数据帧结构;3.构造ARP请求数据帧;4.使用Winpcap相关函数实现数据帧的发送;5.接收及解析目的主机的响应数据帧;6.获得IP地址与MAC地址的对应关系并显示;7.课程设计任务说明书。四、课程设计中涉及的网络基本理论简介:(1)在网际协议中定义的是因特网的IP地址,但在实际进行通信时,物理层不能识别IP地址只能识别物理地址。因此,需在IP地址与物理地址之间建立映射关系,地址之间的这种映射称为地址解析。(2)以太网网络中的物理地址即网卡的序列号。IEEE规定网卡序列号为6个字节(48位),前三个字节为厂商代号,由于厂商向IEEE注册登记申请,后3个字节为网卡的流水号。(3)地址解析包括从IP地址到物理地址的映射和从物理地址到IP地址的映射。TCP/IP协议组提供了两个映射协议:地址解析协议ARP和逆向地址解析协议RARP。ARP用于从IP地址到物理地址的映射,RARP用于从物理地址到IP地址的映射。(4)地址解析协议的ARP的工作原理:假定在一个物理网络上,A(源主机)要与D(目的主机)进行通信,但是不知道D的物理地址。A利用ARP协议工作的过程如下:A广播一个ARP请求报文,请求IP地址为IPD的主机回答其物理地址。网上所有主机都能收到该ARP请求,并将本机IP地址与请求的IP地址比较,D主机识别出自己的地址IPD,并作出回应,通报自己的物理地址。A收到这个ARP回应包后,就可以与D进行通信。为了提高效率,ARP协议使用了高速缓存技术。在每台使用ARP的主机中,都保留了一个专用的内存区,一收到ARP应答,主机就将获得的IP地址和物理地址存入缓存。以后每次要发送报文时,首先到缓存中查找有无相应的项,若找不到,再利用ARP进行地址解析。由于多数网络通信都要连续发送多个报文,所以高速缓存大大提高ARP的效率。在ARP请求报文中还放入源主机的“IP地址——物理地址”的地址对,源主机在广播ARP请求时,网络上所有主机都可以知道该源主机的“IP地址——物理地址”的地址对并将其存入自己的缓存。在新主机入网时,令其主动广播其地址映射,以减少其他主机进行ARP请求。(5)网卡具有如下的几种工作模式:广播模式(BroadCastModel):它的物理地址(目的地址)地址是0Xffffff的帧为广播帧,工作在广播模式的网卡接收广播帧。多播传送(MultiCastModel):多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧,而不论它是不是组内成员。直接模式(DirectModel):工作在直接模式下的网卡只接收目地址是自己Mac地址的帧。混杂模式(PromiscuousModel):工作在混杂模式下的网卡接收所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。(6)ARP帧的数据结构表达方式:以太网帧头中的前两个字段是以太网的目的地址和源地址。目的地址为全1时为广播地址。两个字节长的以太网帧类型表示后面数据的类型。对于ARP请求或应答来说,该字段的值为0X0806.硬件类型字段:指明了发送方想知道的硬件地址的类型,以太网的值为1;应该是接收方;什么硬件,这和以太网有关系吗协议类型字段:表示要映射的协议地址类型,IP为0X0800;硬件地址长度和协议地址长度:指明了硬件地址和高层协议地址的长度,这样ARP帧就可以在任意硬件和任意协议的网络中使用。对于以太网上IP地址的ARP请求或应答来说,它们的值分别为6和4;操作字段:用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4;发送端的以太网地址:源主机硬件地址,6个字节;发送端IP地址:发送端的协议地址(IP地址),4个字节;目的以太网地址:目的端硬件地址,6个字节;目的IP地址:目的端的协议地址(IP地址),4个字节六、运行结果:打开页面:选择网卡1:获取到的结果:七、代码分析:#includestdio.h#includestring.h#includepcap.h#includePacket32.h#pragmapack(1)//按一个字节内存对齐#defineIPTOSBUFFERS12#defineETH_ARP0x0806//以太网帧类型表示后面数据的类型,对于ARP请求或应答来说,该字段的值为x0806#defineARP_HARDWARE1//硬件类型字段值为表示以太网地址#defineETH_IP0x0800//协议类型字段表示要映射的协议地址类型值为x0800表示IP地址#defineARP_REQUEST1#defineARP_REPLY2#defineHOSTNUM255/*packethandler函数原型*/voidpacket_handler(u_char*param,conststructpcap_pkthdr*header,constu_char*pkt_data);//函数原型voidifget(pcap_if_t*d,char*ip_addr,char*ip_netmask);char*iptos(u_longin);char*ip6tos(structsockaddr*sockaddr,char*address,intaddrlen);intSendArp(pcap_t*adhandle,char*ip,unsignedchar*mac);intGetSelfMac(pcap_t*adhandle,constchar*ip_addr,unsignedchar*ip_mac);DWORDWINAPISendArpPacket(LPVOIDlpParameter);DWORDWINAPIGetLivePC(LPVOIDlpParameter);//28字节ARP帧结构structarp_head{unsignedshorthardware_type;//硬件类型unsignedshortprotocol_type;//协议类型unsignedcharhardware_add_len;//硬件地址长度unsignedcharprotocol_add_len;//协议地址长度unsignedshortoperation_field;//操作字段unsignedcharsource_mac_add[6];//源mac地址unsignedlongsource_ip_add;//源ip地址unsignedchardest_mac_add[6];//目的mac地址unsignedlongdest_ip_add;//目的ip地址};//14字节以太网帧结构structethernet_head{unsignedchardest_mac_add[6];//目的mac地址unsignedcharsource_mac_add[6];//源mac地址unsignedshorttype;//帧类型};//arp最终包结构structarp_packet{structethernet_headed;structarp_headah;};structsparam{pcap_t*adhandle;char*ip;unsignedchar*mac;char*netmask;};structgparam{pcap_t*adhandle;};boolflag;structsparamsp;structgparamgp;intmain(){pcap_if_t*alldevs;pcap_if_t*d;intinum;inti=0;pcap_t*adhandle;charerrbuf[PCAP_ERRBUF_SIZE];char*ip_addr;char*ip_netmask;unsignedchar*ip_mac;HANDLEsendthread;HANDLErecvthread;ip_addr=(char*)malloc(sizeof(char)*16);//申请内存存放IP地址if(ip_addr==NULL){printf(申请内存存放IP地址失败!\n);return-1;}ip_netmask=(char*)malloc(sizeof(char)*16);//申请内存存放NETMASK地址if(ip_netmask==NULL){printf(申请内存存放NETMASK地址失败!\n);return-1;}ip_mac=(unsignedchar*)malloc(sizeof(unsignedchar)*6);//申请内存存放MAC地址if(ip_mac==NULL){printf(申请内存存放MAC地址失败!\n);return-1;}/*获取本机设备列表*/if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf)==-1){fprintf(stderr,Errorinpcap_findalldevs:%s\n,errbuf);exit(1);}/*打印列表*/printf([本机网卡列表:]\n);for(d=alldevs;d;d=d-next){printf(%d)%s\n,++i,d-name);if(d-description)printf((%s)\n,d-description);elseprintf((Nodescriptionavailable)\n);}if(i==0){printf(\n找不到网卡!请确认是否已安装WinPcap.\n);return-1;}printf(\n);printf(请选择要打开的网卡号(1-%d):,i);scanf(%d,&inum);if(inum1||inumi){printf(\n该网卡号超过现有网卡数!请按任意键退出…\n);getchar();getchar();/*释放设备列表*/pcap_freealldevs(alldevs);return-1;}/*跳转到选中的适配器*/for(d=alldevs,i=0;iinum-1;d=d-next,i++);/*打开设备*/if((adhandle=pcap_open(d-name,//设备名65536,//65535保证能捕获到不同数据链路层上的每个数据包的全部内容PCAP_OPENFLAG_PROMISCUOUS,//混杂模式1000,//读取超时时间NULL,//远程机器验证errbuf//错误缓冲池))==NULL){fprintf(stderr,\n无法读取该适配器.适配器%s不被WinPcap支持\n,d-name);/*释放设备列表*/pcap_freealldevs(alldevs);return-1;}ifget(d,ip_addr,ip_netmask);//获取所选网卡的基本信息--掩码--IP地址GetSelfMac(adhandle,ip_addr,ip_mac);//输入网卡设备句柄网卡设备ip地址获取该设备的MAC地址sp.adhandle=adhandle;sp.ip=ip_addr;sp.mac=ip_mac;sp.netmask=ip_net

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功