




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课 程 设 计课程名称_计算机网络 题目名称_PING程序设计 2012年12月25日摘要为了深入理解并全面掌握ping命令的使用,以下结合ping程序的原理对其功能进行了深入探讨.由此可见Internet中的某台主机能ping通并不能肯定该主机就能被访问,而ping不通也并不意味着就不能被访问,同时也发现ping命令对网络也存在一些安全隐患.在Window系统下使用Win32进行网络编程实现采用WSA通过IP/ICMP进行实现Ping目的主机的功能。使用VisualStudio2008控制台进行建立的工程,使用Window Socket API 2版本。自己定义IP、ICMP结构体,建立目的地址和原始套接字,调用Win32库函数进行发送、接收数据包。采用ICMP的时间截请求和回答差错报文。本设计包括了具体设计任务,基本思路及所涉及的相关理论,设计流程图,以及考虑到运行中会出现的一些异常处理。关键词:Window网络编程,Socket,TCP/IP,ICMP报文 目录 一、 实验目的5二、 实验内容和要求51、RAW模式的SOCKET编程32、具体内容3三、 实验主要仪器设备和材料3四、 实验方法及原理31. ICMP报文组成结构:62. RAW模式的SOCKET编程实现Ping的具体原理42. 1创建原始套接字42.2设置套接字选项52.3创建并填充相应协议头5五、 实验流程图6六、 实验具体步骤61. 定义IP结构体72. 定义ICMP结构体73. 定义目的地址74. 定义原始套接字75. 发送数据包76. 接收数据包77. 解析数据包88. 校验和的实现89. 打印相关信息810. 循环工作实现块811. 信息统计812. 相关异常处理913. 相关引用到的头文件及宏11七、 实验测试结果以及使用说明11八、 参考文献13九、 附录:源代码14一、 实验目的PING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作。由计算机网络课程知道,ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。课程设计中选取PING程序的设计,其目的是希望同学们通过PING程序的设计,能初步掌握TCP/IP网络协议的基本实现方法,对网络的实现机制有进一步的认识。二、 实验内容和要求1、RAW模式的SOCKET编程PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET编程。熟悉SOCKET的编程,包括基本的系统调用如SOCKET、BIND等;2、具体内容1) 定义数据结构需要定义好IP数据报、ICMP包等相关的数据结构;2) 程序实现在WINDOWS环境下实现PING程序;3) 程序要求在命令提示符下输入: PING .其中为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要求。不带开关变量时,要求返回4次响应。返回信息的格式: REPLY FROM .或 REQUEST TimeOut (无法PING通的情况)。三、 实验主要仪器设备和材料联网Win7操作系统计算机、VisualStudio2008 Win32控制台程序四、 实验方法及原理ping的原理: Ping命令的主要作用是检测网络上主机的状态。要是在几年前,我们还可以下如此断言,如果不能Ping通某台主机,那么也就无法Telnet或者FTP到这台主机,但随着互联网的安全意识的增加,出现了访问控制清单的路由器和防火墙,由于ICMP报文是在IP数据包中被传输的,而到达一台主机不仅取决于IP层是否到达,还取决于使用何种协议和端口。譬如金山公司的金山网镖就可以禁止其他机器Ping通这台主机。所以在现在的情况下,即时Ping不通某台机器,但也有可能FTP登陆到这台机器,或者通过HTTP来浏览这台机器上的Web页面 1. ICMP报文组成结构:在网络中,一般用ICMP来传递差错报文以及其他应注意的信息.ICMP一般被认为是和IP协议同一层的协议,IMCP报文通常被IP层或者更高层的协议(如:TCP或者UDP)使用,ICMP对于互联网以及其他基于IP协议的网络的正常运行起着非常重要的作用.有许多重要的网络程序都是基于ICMP协议上的,最为著名如Ping和Tracert等.2. RAW模式的SOCKET编程实现Ping的具体原理其中PING程序设计使用了RAW模式的SOCKET编程,程序使用ICMP的封装机制,通过IP协议来工作。2. 1创建原始套接字要使用原始套接字,必须经过创建原始套接字、设置套接字选项和创建并填充相应协议头这三个步骤,然后用send、WSASend函数将组装好的数据发送出去。接收的过程也很相似,只是需要用recv或WSARecv函数接收数据。我们可以用socket或WSASocket函数来创建原始套接字,因为原始套接字能直接控制底层协议,因此只有属于“管理员”组的成员,才有权创建原始套接字。下面是用socket函数创建原始套接字的代码。SOCKET sock;Socksocket (AF_INET, SOCK_RAW, IPPROTO_UDP);上述创建原始套接字的代码使用的是UDP协议,如果要使用其它的协议,比如ICMP、IGMP、IP等协议,只需要把相应的参数改为IPPROTO_ICM、IPPROTO_ IGMP、IPPROTO_IP就可以了。另外,IPPROTO_UDP、IPPROTO_IP、IPPROTO_RAW这几个协议标志要求使用套接字选项IP_HDRINCL,而目前只有Windows 2000和Windows XP提供了对IP_HDRINCL的支持,这意味着在Windows 2000以下平台创建原始套接字时是不能使用IP、UDP、TCP协议的。2.2设置套接字选项创建了原始套接字后,就要设置套接字选项,这要通过setsocketopt函数来实现,setsocketopt函数的声明如下:int setsocketopt (SOCKET s,int level,int optname,const char FAR *optval,int optlen );在该声明中,参数s是标识套接口的描述字,要注意的是选项对这个套接字必须是有效的。参数Level表明选项定义的层次,对TCP/IP协议族而言,支持SOL_SOCKET、IPPROTO_IP和IPPROTO_CP层次。参数Optname是需要设置的选项名,这些选项名是在Winsock头文件内定义的常数值。参数optval是一个指针,它指向存放选项值的缓冲区。参数optlen指示optval缓冲区的长度2.3创建并填充相应协议头 这一步就是创建IP和TCP协议头的数据结构,根据相关协议的定义进行编写即可,下面是一个TCP协议头的数据结构。发送接收数据包的实现原理:Sendto()-使用指定的 SocketFlags,将指定字节数的数据发送到指定的终结点。适用于已连接的数据报或流式套接口发送数据。对于数据报类套接口,必需注意发送数据长度不应超过通讯子网的IP包最大长度。IP包最大长度在WSAStartup()调用返回的WSAData的iMaxUdpDg元素中。如果数据太长无法自动通过下层协议,则返回WSAEMSGSIZE错误,数据不会被发送。请注意成功地完成sendto()调用并不意味着数据传送到达。endto()函数主要用于SOCK_DGRAM类型套接口向to参数指定端的套接口发送数据报。对于SOCK_STREAM类型套接口,to和tolen参数被忽略;这种情况下sendto()等价于send()。为了发送广播数据(仅适用于SOCK_DGRAM),in参数所含地址应该把特定的IP地址INADDR_BROADCAST(winsock.h中有定义)和终端地址结合起来构造。通常建议一个广播数据报的大小不要大到以致产生碎片,也就是说数据报的数据部分(包括头)不超过512字节。如果传送系统的缓冲区空间不够保存需传送的数据,除非套接口处于非阻塞I/O方式,否则sendto()将阻塞。对于非阻塞SOCK_STREAM类型的套接口,实际写的数据数目可能在1到所需大小之间,其值取决于本地和远端主机的缓冲区大小。可用select()调用来确定何时能够进一步发送数据。Recvfrom()-接收一个数据报并保存源地址。 对于SOCK_STREAM类型的套接口,最多可接收缓冲区大小个数据。如果套接口被设置为线内接收带外数据(选项为SO_OOBINLINE),且有带外数据未读入,则返回带外数据。应用程序可通过调用ioctlsocket()的SOCATMARK命令来确定是否有带外数据待读入。对于SOCK_STREAM类型套接口,忽略from和fromlen参数。对于数据报类套接口,队列中第一个数据报中的数据被解包,但最多不超过缓冲区的大小。如果数据报大于缓冲区,那么缓冲区中只有数据报的前面部分,其他的数据都丢失了,并且recvfrom()函数返回WSAEMSGSIZE错误。若from非零,且套接口为SOCK_DGRAM类型,则发送数据源的地址被复制到相应的sockaddr结构中。fromlen所指向的值初始化时为这个结构的大小,当调用返回时按实际地址所占的空间进行修改。如果没有数据待读,那么除非是非阻塞模式,不然的话套接口将一直等待数据的到来,此时将返回SOCKET_ERROR错误,错误代码是WSAEWOULDBLOCK。用select()或WSAAsynSelect()可以获知何时数据到达。如果套接口为SOCK_STREAM类型,并且远端“优雅”地中止了连接,那么recvfrom()一个数据也不读取,立即返回。如果立即被强制中止,那么recv()将以WSAECONNRESET错误失败返回。五、 实验流程图-另付图六、 实验具体步骤1. 定义IP结构体/IP格式typedef struct iphUCHARiph_VerLen;/版本-4byteUCHARip_TOS;/区分服务-8byteUSHORTip_Length;/首部长度-4byteUSHORTip_ID;/标识-16byteUSHORTip_Flags;/标志-3byteUCHARip_TTL;/生存数据(数据报在网络上的存活时间,每通过一个路/由器,该数值减一UCHARip_Protacol;/协议(TCP/IP协议类型,比如:ICMP为,IGMP为,TCP为,UDP为等)USHORTip_Checksum;/ 头部检验和ULONGip_Source;/源IP地址ULONGip_Destination; /目的IP地址IPHDR;2. 定义ICMP结构体/ICMP格式typedef struct icmphunsigned char icmp_Type;/类型-8byteunsigned char icmp_Code;/代码-16byteunsigned short icmp_Checksum;/检验和-16byteunsigned short icmp_Id;/识别号unsigned short icmp_Sequence;/报文序列号unsigned long icmp_Timestamp;/时间截ICMPHDR, *PICMPHDR;3. 定义目的地址/目标主机地址SOCKADDR_IN addrdest;addrdest.sin_family=AF_INET;/是地址家族,AF_INET,代表TCP/IP协议族addrdest.sin_addr.S_un.S_addr = inet_addr(ip);/存储IP地址,使用in_addr这个数据结addrdest.sin_port = htons(0);/存储端口号(使用网络字节顺序)4. 定义原始套接字SOCKET sk = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);/使用RAWsocket模式。ICMP协议5. 发送数据包result = sendto(sk,sendbuf,sizeof(ICMPHDR)+DATA_SIZE,0,(SOCKADDR *)&addrdest,sizeof(SOCKADDR);6. 接收数据包result= recvfrom(sk, recvbuf, RECV_MAX_SZIE, 0, (SOCKADDR*)&addrfrom, &len)7. 解析数据包IPHDR *pIP = (IPHDR*)recvbuf;PICMPHDR p = (PICMPHDR)(recvbuf+sizeof(IPHDR);8. 校验和的实现USHORT CheckSum(USHORT *buffer,int size)USHORT checksum = 0;while(size1)checksum +=*buffer+;size -= sizeof(SHORT);if(size)checksum +=*buffer+;/进行校验checksum = (checksum16)+(checksum&0xffff);checksum += (checksum16);return (SHORT)(checksum);9. 打印相关信息目的地址:cout - 来自: inet_ntoa(addrfrom.sin_addr);接收字节:cout 的回复: 字节= DATA_SIZE ;时间截:cout 时间= icmp_Timestamp ms;数据包生存数据:cout TTL= ipTTL endl;10. 循环工作实现块Ping多次或者无穷次运行的实现 while( a | count- )当a=true 进行无穷次Ping当 count 数字不为默认或者为默认(4次)进行自减,count=-1就退出当Ping完结束后没有关闭程序,而是现实欢迎使用页面While(true)/*Ping的程序*/11. 信息统计/统计信息int getData =0;/获取到数据包个数int loseData =0;/丢失数据包的个数int setData = count;/发送数据包的个数int maxTime = 0;/最大时间截int minTime = 0;/最小时间截int average = 0;/平均时间截11.1获取到的数据包个数统计if( DATA_SIZE!=NULL)getData+;11.2时间截的统计/往返估计时间if(maxTime icmp_Timestamp)maxTime = nTick-p-icmp_Timestamp;elseif(minTime=0)minTime = nTick-p-icmp_Timestamp;if(minTime nTick-p-icmp_Timestamp)minTime = nTick-p-icmp_Timestamp;11.3丢失的数据包个数 loseData = setData - getData;12. 相关异常处理12.1WSA的版本测试if (LOBYTE(data.wVersion) != 2 | HIBYTE(data.wVersion) != 2)cout Windows SOCKET 初始化失败! endl;WSACleanup();return 0;12.2设置发送超时if (SOCKET_ERROR = rst)cout 设置SOCKET初始化出错!发送超时,请检查! endl;closesocket(sk);WSACleanup();return -1;12.3设置接收超时rst = setsockopt(sk, SOL_SOCKET, SO_RCVTIMEO, (char*)&outTime, sizeof(int);if (SOCKET_ERROR = rst)cout 设置SOCKET初始化出错!接收超时,请检查! endl;closesocket(sk);WSACleanup();return -1;12.4向目的地址发送数据包异常if(SOCKET_ERROR=result)if(WSAETIMEDOUT=WSAGetLastError()cout: 发送超时!endl;continue;elsecout: 发送出错!endl;closesocket(sk);WSACleanup();return -1;12.5接收数据包过程异常if(SOCKET_ERROR=result)if(WSAETIMEDOUT=GetLastError()cout: 接收超时!endl;continue;elsecout: 接收出错!endl; closesocket(sk);WSACleanup();return -1;12.6接收到的数据包异常if (result sizeof(IPHDR) + sizeof(ICMPHDR) + DATA_SIZE)cout :
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 地砖专业知识培训班课件
- 2026届江苏省连云港市东海高级中学化学高二上期中调研模拟试题含解析
- 新品上线佣金合同
- 2025年乡镇民政办养老护理员招聘面试预测题及答案
- 2025年给排水试卷及答案
- 2025合作发展合同范文
- 短租机场停车场协议
- 2025年军队文职人员统一招聘笔试( 教育学)高频错题及答案
- 与青春同行作文800字青春作文(15篇)
- 家庭农场动物疫病防治合作合同书
- 2025至2030年中国H酸行业投资前景及策略咨询研究报告
- 物流运营方案策划与设计
- 摩托车文化课件:全面了解摩托车的历史与现状
- 《护理学专业介绍》课件
- 老年心房颤动诊治中国专家共识2024版
- 2025年全国高压电工证(复审)理论考试试题(1000题)附答案
- 2024年湖北省房县事业单位公开招聘医疗卫生岗笔试题带答案
- 2025年中国微型小家具市场调查研究报告
- 食材配送相关管理制度
- 医院课件:《老年综合评估》
- 知识产权侵权培训课件
评论
0/150
提交评论