通信专业方向设计课程设计网络丢包率测量程序设计_第1页
通信专业方向设计课程设计网络丢包率测量程序设计_第2页
通信专业方向设计课程设计网络丢包率测量程序设计_第3页
通信专业方向设计课程设计网络丢包率测量程序设计_第4页
通信专业方向设计课程设计网络丢包率测量程序设计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、西南科技大学通信专业方向设计课程名称: 通信工程方向设计 设计名称: 网络丢包率测量程序设计 姓 名: 学 号: 班 级: 指导教师: 起止日期: 西南科技大学信息工程学院制22课 程 设 计 任 务 书学生班级: 学生姓名: 学号: 设计名称: 起止日期: 指导教师: 设计要求:1. 设计一个小型局域网,并给出拓扑结构图;2. 完成局域网的构建,给出相应的设备清单和参数设置;3. 使用raw模式的socket编程,完成ping程序设计,给出调试结果4. 编写客户程序和服务器程序,实现数据传输5. 提供设计流程图和程序清单6. 撰写论文(5000字以上)课 程 设 计 学 生 日 志时间设计内

2、容12.2-12.8了解题目及设计要求。12.8-12.18查阅相关资料,确定设计方案。12.19-12.21编写及调试程序。12.20-12.30撰写课程设计报告。12.31-01.02进行答辩。课 程 设 计 考 勤 表周星期一星期二星期三星期四星期五课 程 设 计 评 语 表指导教师评语:成绩: 指导教师: 年 月 日ping程序的设计一、 设计目的和意义要求设计并构建一个局域网,通过在这个计算机网络环境中的实际操作,对现代计算机网络的基本功能和体系结构进一步了解。通过一个简单的ping程序的设计和实现,理解tcp/ip协议的工作机制和编程方法;掌握计算机网络应用层协议的基本实现技术。通

3、过在计算机网络环境中的实际操作,对现代计算机网络基本功能和体系结构进一步了解。通过一个简单的ping程序的设计和实现,理解tcp/ip协议的工作机制和编程方法;掌握计算机网络应用层协议的基本实现技术及各种协议的结构。掌握raw模式的socket编程的方法。二、 设计原理1、ping的工作原理 ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。ping 使用的是icmp协议,它发送icmp回送请求消息给目的主机。icmp协议规定:目的主机必须返回icmp回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。 icmp协议通过

4、ip协议发送的,ip协议是一种无连接的,不可靠的数据包协议。因此,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是icmp(网络控制报文)协议。 当传送ip数据包发生错误比如主机不可达,路由不可达等等,icmp协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建立在ip层以上的协议是可能做到安全的原因。icmp数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。而前 16bit就组成了icmp所要传递的信息。ping利用icmp协议包来侦测另一个主机是否可达。原理是用类型码为0的icmp发请求,受到请求的主机则用类型码为8的ic

5、mp回应。ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况。随着互联网的安全意识的增加,出现了访问控制清单的路由器和防火墙,由于icmp报文是在ip数据包中被传输的,而到达一台主机不仅取决于ip层是否到达,还取决于使用何种协议和端口。所以在现在的情况下,即时ping不通某台机器,但也有可能ftp登陆到这台机器,或者通过http来浏览这台机器上的web页面。2.利用ping命令检查网络故障事实上,无论是什么类型的故障诊断工具,在一些特殊网络故障面前都会显得无能为力;此时,我们所能做的就是依靠自己,从使用ping命令开始,手工逐步排查故障原因。首先对本地工作站的循环

6、地址进行ping测试。当遇到一些无法直接找到故障原因的特殊网络故障时,我们首先需要使用ping命令测试一下本地工作站的循环地址能否被正常ping通,倘若该地址无法被正常ping通的话,那么说明本地工作站的tcp/ip协议程序受到了破坏,或者网卡设备发生了损坏。 此时,我们不妨打开本地工作站系统的设备管理器窗口,从中找到网卡设备选项,并用鼠标右键单击该选项,从弹出的快捷菜单中执行“属性”命令,打开网卡设备的属性设置窗口,在该窗口的“常规”标签页面中我们就能看到当前的网卡工作状态是否正常了。 当发现网卡工作状态正常的话,那很有可能是本地工作站的tcp/ip协议程

7、序受到了破坏,此时我们不妨打开本地连接属性设置窗口,选中并删除该设置窗口中的tcp/ip协议选项,之后再重新安装一下tcp/ip协议程序,相信这么一来本地工作站的循环地址就能被正常ping通了。 其次对本地工作站的ip地址进行ping测试。在确认地址能够被ping通的情况下,我们继续使用ping命令测试一下本地工作站的静态ip地址是否能被正常ping通,倘若该地址不能被正常ping通的话,那么说明本地工作站的网卡参数没有设置正确,或者网卡驱动程序不正确,也有可能是本地的路由表受到了破坏。 此时我们可以重新检查一下本地工作站的网络参数是否设置正确,如果在网络参

8、数设置正确的情况下仍然无法ping通本地ip地址的话,我们最好重新安装一下网卡设备的原装驱动程序,相信这么一来我们就能正确ping通本地工作站的静态ip地址了。一旦本地工作站的静态ip地址被顺利ping通的话,那就表明本地工作站已经能够加入到局域网网络中了。接着对本地局域网的默认网关地址进行ping测试。由于本地工作站是通过网关与局域网中的其他工作站进行相互通信的,只有本地工作站与默认网关之间连接正常,才能确保本地工作站与其他工作站通信正常。倘若网关地址能被正常ping通的话,那就表明本地工作站可以与局域网中的其他工作站进行正常通信。 要是ping命令操作不成功的话,那很有可能是网关设备自身存

9、在问题,或者是本地工作站与网关之间的线路连接不正常,也有可能是本地工作站与网关没有设置成同一个子网中。此时,我们可以先用专业的线缆测试工具测试一下网络线缆的连通性,在线缆连通性正常的情况下,再检查本地工作站的网络参数是否与网关的参数设置成同一个子网中。倘若网络参数设置正确的话,我们再从其他工作站ping一下网关地址,以便确认网关自身是否存在原因,如果局域网中的其他工作站也无法ping通网关的话,那多半是网关设备自身存在问题,这个时候我们只要将故障排查重点锁定在网关设备上就可以了。 下面对局域网中任意一台远程工作站的ip地址进行ping测试,以便检验本地工作站能否通过网关设备与局域网中的其他工作

10、站进行通信。要是我们发现远程工作站的ip地址无法ping通的话,那很有可能是远程工作站自身无法响应,或者是远程工作站与网关设备之间的线路连接出现了问题,此时我们可以将网络故障的排查重点聚焦到远程工作站上或者是局域网的网络设备上。 最后对局域网的远程工作站主机名称进行ping测试。在确认能够ping通远程工作站ip地址的情况下,仍然出现无法访问远程工作站内容的时候,我们就有必要进行这一项测试操作。如果该主机名称无法被ping成功的话,那很有可能是dns解析出现了问题,而不是网络连接发生了故障,此时我们不妨把故障检查重点锁定在dns服务器上。3、raw模式的socket编程 ping程序是面向用户

11、的应用程序,该程序使用icmp的封装机制,通过ip协议来工作。为了实现直接对ip和icmp包进行操作,设计中使用raw模式的socket编程。 raw socket,即原始套接字,可以接收本机网卡上的数据帧或者数据包,对与监听网络的流量和分析是很有作用的。 要使用原始套接字,必须经过创建原始套接字、设置套接字选项和创建并填充相应协议头这三个步骤,然后用send、wsasend等函数将组装好的数据发送出去。接收的过程也很相似,只是需要用recv或wsarecv等函数接收数据。三、 详细设计步骤1. ip、icmp头部结构ip是英文internet protocol(网络之间互连的协议)的缩写,中

12、文简称为“网协”,也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守 ip协议就可以与因特网互连互通。ip地址具有唯一性,根据用户性质的不同,可以分为5类。另外,ip还有进入防护,知识产权,指针寄存器等含义。/* ip头部定义 */typedef struct _iphdr unsigned char h_len:4;/ 头长度,占4bit unsigned char version:4;/ ip版本,占4bit unsigned char to

13、s;/ 服务类型 unsigned short total_len;/ 包的总长度 unsigned short ident;/ 包标示身份 unsigned short frag_and_flags;/ 标志 unsigned char ttl;/ 包生命周期 unsigned char proto;/ 协议类型 unsigned short checksum;/ ip 校验 unsigned int sourceip;/ 32位源ip地址 unsigned int destip;/ 32位目标ip地址 ipheader;windows是小端模式,所以h_len变量在version前面;如果

14、是unix系统version在h_len变量前面。icmp是(internet control message protocol)internet控制报文协议。它是tcp/ip协议族的一个子协议,用于在ip主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。/* icmp头部定义 */typedef struct _icmphdr byte i_type;/ icmp报文类型 byte i_code;/ 该类型中的代码号,一种icmp 报文的类型号和该类型中的代码号共同决定。

15、ushort i_cksum;/ 校验和 ushort i_id;/ 当前进程pid ushort i_seq;/ 序列号,序列号从0开始,每发送一次新的回显请求就加1. ulong timestamp;/ 时间戳 icmpheader;增加了timestamp变量存储时间戳,用于计算传输数据的时间。2. socket库 使用winsock2 api编程,必须包含头文件winsock2.h (链接环境ws2_32.lib),头文件winsock.h(wsock32.lib)是为了兼容winsock1程序时使用的,另外mswsock.h(mswsock.dll)是微软的扩展类,用于开发高性能的w

16、insock程序。windows环境下socket基本函数(1)wsastartup函数int wsastartup(word wversionrequested,lpwsadata lpwsadata);使用socket的程序在使用socket之前必须调用wsastartup函数。该函数的第一个参数指明程序请求使用的socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的socket的版本信息。当一个应用程序调用wsastartup函数时,操作系统根据请求的socket版本来搜索相应的socket库,然后绑定找到的socket库到该应用程序中。以后应用程

17、序就可以调用所请求的socket库中的其它socket函数了。该函数执行成功后返回0。 例:假如一个程序要使用2.1版本的socket,那么程序代码如下wversionrequested = makeword( 2, 1 ); err = wsastartup( wversionrequested, &wsadata ); (2)wsacleanup函数 int wsacleanup (void); 应用程序在完成对请求的socket库的使用后,要调用wsacleanup函数来解除与socket库的绑定并且释放socket库所占用的系统资源。 (3)wsasocket函数socket wsaa

18、pi wsasocket(int af,int type,int protocol, lpprotocol_info lpprotocolinfo, group g,int iflags); 创建一个与指定传送服务提供者捆绑的套接口,可选地创建和/或加入一个套接口组。 此函数为socket()的扩展版本,其功能都是创建一个原始套接字。使用时需要包含 winsock2.h 头文件和链接wsock32.lib库。参数定义:af:地址族描述。目前仅支持af_inet格式,亦即arpa internet地址格式。 type:新套接口的类型描述。 protocol:套接口使用的特定协议,如果调用者不愿指

19、定协议则定为0。 lpprotocolinfo:一个指向protocol_info结构的指针,该结构定义所创建套接口的特性。如果本参数非零,则前三个参数(af, type, protocol)被忽略。 g:套接口组的描述字。 iflags:套接口属性描述。(4)closesocket函数 int closesocket( socket s ); closesocket函数用来关闭一个描述符为s套接字。由于每个进程中都有一个套接字描述符表,表中的每个套接字描述符都对应了一个位于操作系统缓冲区中的套接字数据结构,因此有可能有几个套接字描述符指向同一个套接字数据结构。套接字数据结构中专门有一个字段存

20、放该结构的被引用次数,即有多少个套接字描述符指向该结构。当调用closesocket函数时,操作系统先检查套接字数据结构中的该字段的值,如果为1,就表明只有一个套接字描述符指向它,因此操作系统就先把s在套接字描述符表中对应的那条表项清除,并且释放s对应的套接字数据结构;如果该字段大于1,那么操作系统仅仅清除s在套接字描述符表中的对应表项,并且把s对应的套接字数据结构的引用次数减1。 closesocket函数如果执行成功就返回0,否则返回socket_error。 setsockopt函数 int pascal far setsockopt( socket s, int level, int

21、optname, const char far *optval, int optlen); setsockopt()函数用于任意类型、任意状态套接口的设置选项值。尽管在不同协议层上存在选项,但本函数仅定义了最高的“套接口”层次上的选项。选项影响套接口的操作,诸如加急数据是否在普通数据流中接收,广播数据是否可以从套接口发送等等。 参数定义:s:标识一个套接口的描述字。 level:选项定义的层次;目前仅支持sol_socket和ipproto_tcp层次。 optname:需设置的选项。 optval:指针,指向存放选项值的缓冲区。 optlen:optval缓冲区长度。sendto函数 int

22、 pascal far sendto( socket s, const char far* buf, int len, int flags, const struct sockaddr far* to, int tolen); 指向一指定目的地发送数据,sendto()适用于已连接的数据报或流式套接口发送数据。参数定义:s:一个标识套接口的描述字。 buf:包含待发送数据的缓冲区。 len:buf缓冲区中数据的长度。 flags:调用方式标志位。 to:(可选)指针,指向目的套接口的地址。 tolen:to所指地址的长度。 recvfrom函数 int pascal far recvfrom(

23、 socket s, char far* buf, int len, int flags, struct sockaddr far* from, int far* fromlen); 本函数用于从(已连接)套接口上接收数据,并捕获数据发送源的地址。 参数定义:s:标识一个已连接套接口的描述字。 buf:接收数据缓冲区。 len:缓冲区长度。 flags:调用操作方式。 from:(可选)指针,指向装有源地址的缓冲区。 fromlen:(可选)指针,指向from缓冲区长度值。3. 程序功能函数(1)fillicmpdata函数void fillicmpdata(char *icmp_data,

24、int datasize);初始化icmp数据。void fillicmpdata(char *icmp_data, int datasize) icmpheader *icmp_hdr = null;char *datapart = null; icmp_hdr = (icmpheader *)icmp_data;/ 强制转换为icmp头部结构 icmp_hdr-i_type = icmp_echo;/ 回显请求(ping请求) icmp_hdr-i_code = 0;/ 要求有ip回应 icmp_hdr-i_id = (ushort)getcurrentprocessid();/ 取得当前

25、进程pid icmp_hdr-i_cksum = 0;/ 校验和 icmp_hdr-i_seq = 0;/ 序列号datapart = icmp_data + sizeof(icmpheader);memset(datapart,0xff,datasize-sizeof(icmpheader); / 填充无用数据return;(2) checksum函数ushort checksum(ushort *buffer, int size);计算校验和。ushort checksum(ushort *buffer, int size) unsigned long cksum=0; while(siz

26、e 1) cksum += *buffer+; size -= sizeof(ushort); if(size) cksum += *(uchar *)buffer; cksum = (cksum 16) + (cksum & 0xffff); cksum += (cksum 16); return (ushort)(cksum);(3) decodeicmpheader函数void decodeicmpheader(char *buf, int bytes, sockaddr_in *from);解析并显示icmp数据。获取数据: ipheader *iphdr = null;/ ip头部

27、icmpheader *icmphdr = null;/ icmp头部 unsigned short iphdrlen;/ ip头部长度 dword tick;/ 时间戳 static int icmpcount = 0;/ icmp回显应答计数 iphdr = (ipheader *)buf;/ 强制转换为ip头部 iphdrlen = iphdr-h_len * 4;/ ip头部长度tick = gettickcount();/ 获取时间戳数据验证: if(bytes sin_addr); icmphdr = (icmpheader *)(buf + iphdrlen);/ 强制转换为ic

28、mp头部 if(icmphdr-i_type != icmp_echoreply)/ 非回显应答 if(icmphdr-i_type=3&icmphdr-i_code=1)puts(无法访问目标主机);elseprintf(nonecho type:%d code:%d recvd.rn, icmphdr-i_type,icmphdr-i_code); return; if(icmphdr-i_id != (ushort)getcurrentprocessid() / 非本程序的回应 printf(其他程序的回应报文! t错误代码 %dn,wsagetlasterror(); return ;

29、 (4) cleanup函数void cleanup();释放相关资源。void cleanup() if(m_hsocket != invalid_socket) closesocket(m_hsocket);/ 关闭套接字 heapfree(getprocessheap(), 0, recvbuf);/ 释放堆栈空间 heapfree(getprocessheap(), 0, icmp_data);/ 释放堆栈空间 wsacleanup();/ 释放socket占用的资源return;4. 程序主体(1) 输入地址(2) 数据初始化(3) 定义并初始化相关变量。(4) 绑定并创建套接字调用

30、wsastartup(makeword(2, 2), &wsadata),绑定2.2套接字库。调用wsasocket(af_inet,sock_raw,ipproto_icmp,null,0, wsa_flag_overlapped);创建套接字。setsockopt(m_hsocket, sol_socket, so_rcvtimeo, (char *)&timeout, sizeof(timeout);setsockopt(m_hsocket, sol_socket, so_sndtimeo, (char*)&timeout, sizeof(timeout);设置套接字超时选项。(5) 解

31、析目标地址首先尝试转换为网络字节地址,如果不是合法ip地址,则用gethostbyname()函数将目标地址当做是主机名或者域名。(6) 创建icmp数据分配堆空间并初始化,然后调用fillicmpdata()函数初始化icmp数据。(7) 发送接收icmp调用sendto()函数发送icmp数据包,调用recvfrom()函数接收目标的icmp回显请求报文。然后调用decodeicmpheader()函数解析并输出icmp数据内容。(8) 统计信息输出发送和接收的icmp数据包数量,计算并显示丢包率。6. 程序流程图开始定义及初始化各个全局变量判断wsastartup函数是否调用成功输出调用

32、失败否创建套接字以及设置socket接收超时,发送超时选项;是解析输入的参数 设置ping参数创建及填充icmp数据报文判断是否已发送ncount次break;发送,接收以及解析数据包输出piing结果是结束清除残余否7. 网络构建本次实验使用虚拟机安装windows7系统,与实体主机构成一个小型局域网进行测试。实际主机ip: 系统:windows xp虚拟主机ip:01 系统:windows 7由于本程序可以测试网络主机丢包率,所用可以不用搭建局域网。四、 设计结果及分析1,无丢失的情况2.丢失的情况通过以上结果分析ping程序能正常工作并准确

33、的测试出丢包率,达到了实验的预期设想和目的。设计并构建了一个局域网,通过在这个计算机网络环境中的实际操作,对现代计算机网络的基本功能和体系结构进一步了解。通过一个本实验的ping程序的设计和实现,理解了tcp/ip协议的工作机制和编程方法;掌握计算机网络应用层协议的基本实现技术。五、 设计体会 socket_raw允许对较低层次的协议直接访问,比如ip、 icmp协议,它常用于检验新的协议实现,或者访问现有服务中配置的新设备,因为raw socket可以自如地控制windows下的多种协议,能够对网络底层的传输机制进行控制,可以应用原始套接字来操纵网络层和传输层应用。 这次设计需要对ip头部和

34、icmp头部结构有一定的了解,通过本次设计我对socket编程方法有了更深的了解,加强了自己对网络编程的运用,同时也锻炼了自己查找资料,整理资料的能力。六、 致谢在此由衷地感谢我们的黄玉清老师.,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;这次课程设计的每个实验细节和每个数据,都离不开老师您的细心指导。而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。七、 参考文献1 winsocket编程 2 ping程序设计 3 winsocket基础

35、教程 4 raw socket介绍及编程 附录:ping程序代码#pragma comment(lib,ws2_32.lib)#include #include #include #include #include /* ip头部定义 */typedef struct _iphdr unsigned char h_len:4;/ 头长度,占4bit unsigned char version:4;/ ip版本,占4bit unsigned char tos;/ 服务类型 unsigned short total_len;/ 包的总长度 unsigned short ident;/ 包标示身份

36、unsigned short frag_and_flags;/ 标志 unsigned char ttl;/ 包生命周期 unsigned char proto;/ 协议类型 unsigned short checksum;/ ip 校验 unsigned int sourceip;/ 32位源ip地址 unsigned int destip;/ 32位目标ip地址 ipheader;#define icmp_echo 8/ icmp类型 echo request回显请求(ping请求)#define icmp_echoreply 0/ icmp类型 echo reply 回显应答(ping应

37、答)#define icmp_min 8/ 最小8字节的包头部 /* icmp头部定义 */typedef struct _icmphdr byte i_type;/ icmp报文类型 byte i_code;/ 该类型中的代码号,一种icmp 报文的类型号和该类型中的代码号共同决定。 ushort i_cksum;/ 校验和 ushort i_id;/ 当前进程pid ushort i_seq;/ 序列号,序列号从0开始,每发送一次新的回显请求就加1. ulong timestamp;/ 时间戳 icmpheader;/* 参数设置 */#define def_packet_size 32/

38、 默认包大小#define max_packet 4096/ 最大icmp 包长度 #define max_ip_hdr_size 60/ 最大ip头长度 int datasize=def_packet_size;/ 数据大小char *icmp_data=null;/ icmp数据缓存char *recvbuf=null;/ 接收数据缓存socket m_hsocket= invalid_socket;/ 套接字char *ipdest=null;/ 目标ip地址int sendnum;/ 发送的回显请求数int recvnum;/ 接收的回显应答数/* 初始化icmp数据 */void f

39、illicmpdata(char *icmp_data, int datasize) icmpheader *icmp_hdr = null;char *datapart = null; icmp_hdr = (icmpheader *)icmp_data;/ 强制转换为icmp头部结构 icmp_hdr-i_type = icmp_echo;/ 回显请求(ping请求) icmp_hdr-i_code = 0;/ 要求有ip回应 icmp_hdr-i_id = (ushort)getcurrentprocessid();/ 取得当前进程pid icmp_hdr-i_cksum = 0;/ 校

40、验和 icmp_hdr-i_seq = 0;/ 序列号datapart = icmp_data + sizeof(icmpheader);memset(datapart,0xff,datasize-sizeof(icmpheader); / 填充无用数据return;/* 校验和 */ushort checksum(ushort *buffer, int size) unsigned long cksum=0; while(size 1) cksum += *buffer+; size -= sizeof(ushort); if(size) cksum += *(uchar *)buffer;

41、 cksum = (cksum 16) + (cksum & 0xffff); cksum += (cksum 16); return (ushort)(cksum);/* 解析icmp数据 */void decodeicmpheader(char *buf, int bytes, sockaddr_in *from) ipheader *iphdr = null;/ ip头部 icmpheader *icmphdr = null;/ icmp头部 unsigned short iphdrlen;/ ip头部长度 dword tick;/ 时间戳 static int icmpcount =

42、0;/ icmp回显应答计数 iphdr = (ipheader *)buf;/ 强制转换为ip头部 iphdrlen = iphdr-h_len * 4;/ ip头部长度 tick = gettickcount();/ 获取时间戳 if(bytes sin_addr); icmphdr = (icmpheader *)(buf + iphdrlen);/ 强制转换为icmp头部 if(icmphdr-i_type != icmp_echoreply)/ 非回显应答 if(icmphdr-i_type=3&icmphdr-i_code=1)puts(无法访问目标主机);elseprintf(n

43、onecho type:%d code:%d recvd.rn, icmphdr-i_type,icmphdr-i_code); return; if(icmphdr-i_id != (ushort)getcurrentprocessid() / 非本程序的回应 printf(其他程序的回应报文! t错误代码 %dn,wsagetlasterror(); return ; dword tick0; tick0=tick - icmphdr-timestamp;/ 获取响应时间 if(tick01) printf(来自 %s 的回复: 字节=%d 时间sin_addr), bytes-def_p

44、acket_size, iphdr-ttl, icmphdr-i_seq); elseprintf(来自 %s 的回复: 字节=%d 时间=%dms ttl=%d icmp_seq = %dn,inet_ntoa(from-sin_addr), bytes-def_packet_size,tick0, iphdr-ttl, icmphdr-i_seq); icmpcount+;recvnum+;/ 接收的回显应答数return;/* 释放资源 */void cleanup() if(m_hsocket != invalid_socket) closesocket(m_hsocket);/ 关闭

45、套接字 heapfree(getprocessheap(), 0, recvbuf);/ 释放堆栈空间 heapfree(getprocessheap(), 0, icmp_data);/ 释放堆栈空间 wsacleanup();/ 释放socket占用的资源return;/* 主函数 */int main(int argc, char *argv)char add105;printf(pingnenter ip: );scanf(%s,add);ipdest=add;unsigned int ncount=4;int timeout=1000;/* 初始化 */ wsadata wsadat

46、a;/ 保存wsastartup返回的windows sockets初始化信息 sockaddr_in m_addrdest;/ 目标地址 sockaddr_in m_addrfrom;/ 接收地址 sendnum=ncount;recvnum=0; ushortseq_no=0;/* 绑定socket库 */ if(wsastartup(makeword(2, 2), &wsadata) != 0) printf(sorry, you cannot load socket dll!); /* 创建套接字 */ m_hsocket = wsasocket(af_inet, sock_raw, ipproto_icmp,

温馨提示

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

评论

0/150

提交评论