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

付费下载

下载本文档

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

文档简介

PAGE17课程设计(论文)任务书学院专业班一、课程设计(论文)题目计算机网络课程设计二、课程设计(论文)工作自2012年6月日起至2012年6月日止。三、课程设计(论文)地点:四、课程设计(论文)内容要求:1.本课程设计的目的通过课程设计,使学生理论联系实际,在实践中进一步了解计算机网络体系结构,深入理解TCP/IP参考模型,掌握各种网络工程技术和网络规划与设计,初步掌握综合布线技术、高速局域网技术、广域网接入技术、网络互联技术,初步掌握网络应用程序开发技术以及互联网的应用技术。培养学生分析、解决问题的能力,提高学生的科技论文写作能力。2.课程设计的任务及要求1)基本要求:(1)熟悉交换机、路由器等网络设备的功能和使用;(2)掌握网络规划与设计,掌握网络安全与管理技术;(3)初步掌握网络应用程序设计技术和互联网应用技术。2)课程设计论文编写要求(1)理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订。(2)课程设计报告(论文)包括目录、绪论、正文、设计小结、参考文献、附录等3)课程设计评分标准:(1)考勤与学习态度:20分(2)理论理解与课程设计报告论文:40分;(3)动手操作与实验设计:20分;(4)设计论文答辩:20分。4)参考文献:(1)《计算机网络(第四版)》主编:谢希仁出版社:电子工业出版社出版时间:2004年7月(2)《计算机网络课程设计》主编:吴功宜胡晓英张仁何云王宁出版社:机械工业出版社出版或修订时间:2005年9月(3)《计算机网络设计》主编:易建勋出版社:人民邮电出版社出版或修订时间:2007年10月

5)课程设计进度安排内容天数地点1.选择设计题目、了解设计目的要求、查阅相关理论资料1天图书馆、机房2.设计方案选型及实验室完成相关的设计任务2天实验室3.总结课程设计任务和设计步骤,撰写课程设计论文2天图书馆、机房、实验室学生签名:2012年6月18日6)选择课程设计题目具体要求:用winsock设计Ping应用程序理解winsock技术网络编程技术,分析PING应用程序设计原理和程序流程,选择合适的开发环境,参考已有的PING程序功能,设计实现ping功能的应用程序。设计论文要求:分析winsock编程技术;分析ping程序的功能及其相关网络协议;给出ping程序流程图和设计方案;选择开发环境,编译源程序;给出软件测试文档;设计小结;参考文献(包括互联网上的引用信息)。课程设计(论文)评审意见(1)考勤与学习态度(20分):优()、良()、中()、一般()、差();(2)理论理解与课程设计报告论文(40分):优()、良()、中()、一般()、差();(3)动手操作与实验设计(20分):优()、良()、中()、一般()、差();(4)设计论文答辩(20分):优()、良()、中()、一般()、差();(5)格式规范性及考勤是否降等级:是()、否()评阅人:职称:讲师2012年6月24日PAGE17目录TOC\o"1-2"\h\z\u131681.绪论 1252831.1.课程设计的目的及意义 1148601.2.课程设计的任务及要求 111771.3.课程设计题目具体要求 1294792.Winsock编程技术 2160142.1.Winsock的基本概念 2210112.2.Winsock编程的特点 2177992.3.Winsock基本的API 2295883.ping程序的功能及其相关网络协议 6227493.1.ping程序的功能 61613.2.ping的相关协议 6206534.ping程序的设计方案 7245634.1.ping程序的工作流程 7295814.2.选择开发环境,编译源程序 8300625.软件测试 13304496.设计小结 16259557.参考文献 17用winsock设计Ping应用程序XX大学课程设计报告PAGE8PAGE7绪论课程设计的目的及意义通过课程设计,使学生理论联系实际,在实践中进一步了解计算机网络体系结构,深入理解TCP/IP参考模型,掌握各种网络工程技术和网络规划与设计,初步掌握综合布线技术、高速局域网技术、广域网接入技术、网络互联技术,初步掌握网络应用程序开发技术以及互联网的应用技术。培养学生分析、解决问题的能力,提高学生的科技论文写作能力。课程设计的任务及要求1)基本要求:(1)熟悉交换机、路由器等网络设备的功能和使用;(2)掌握网络规划与设计,掌握网络安全与管理技术;(3)初步掌握网络应用程序设计技术和互联网应用技术。2)课程设计论文编写要求(1)理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订。(2)课程设计报告(论文)包括目录、绪论、正文、设计小结、参考文献、附录等课程设计题目具体要求用winsock设计Ping应用程序:理解winsock技术网络编程技术,分析PING应用程序设计原理和程序流程,选择合适的开发环境,参考已有的PING程序功能,设计实现ping功能的应用程序。设计论文要求:分析winsock编程技术;分析ping程序的功能及其相关网络协议;给出ping程序流程图和设计方案;选择开发环境,编译源程序;给出软件测试文档;设计小结;参考文献(包括互联网上的引用信息)。

Winsock编程技术Winsock的基本概念Socket在英文中是插座的意思,他的设计者实际上是暗指电话插座。因为在Socket环境下编程很像是模拟打电话,Internet的IP地址就是电话号码,要打电话,需要电话插座,在程序中就是向系统申请一个Socket,以后两台机器上的程序“交谈”都是通过这个Socket来进行的。对程序员来说,也可以把Socket看成一个文件指针,只要向指针所指的文件读写数据,就可以实现双向通信。利用Socket进行通信,有两种主要的方式。第一种是面向连接的流方式。顾名思义,在这种方式下,两个通信的应用程序之间要先建立一种连接链路,其过程好像在打电话。一台计算机(电话)要想和另一台计算机(电话)进行数据传输(通话),必须先获得一条链路,只有确定了这条通路之后,数据(通话)才能被正确接受和发送。这种方式对应的是TCP协议。第二种叫做无连接的数据报文方式,这时两台计算机像是把数据放在一个信封里,通过网络寄给对方,信在传输的过程种有可能会残缺不全,而且后发出的信也有可能会先收到,它对应的是UDP协议。流方式的特点是通信可靠,对数据有校验和重发机制,通常用来做数据文件的传输,如FTP、Telnet等;数据报文方式由于取消了重发校验机制,能够打到较高的通信速率,可以用于数据可靠性要求不高的通信,如实时的语音、图像传送和关波消息等。在ISO的OSI网络七层协议中,Winsock主要负责的是控制数据的输入和输出,也就是传输层和网络层。Winsock屏蔽了数据链路层和物理层,它的出现给Windows下的网络编程带来了巨大的变化。Winsock编程的特点在网络通信中,由于网络拥挤或一次发送的数据量过大等原因,经常会发生交换的数据在短时间内不能传送完,收发数据的函数因此不能返回的现象,这种现象叫做阻塞。Winsock对有可能阻塞的函数提供了两种处理方式——阻塞和非阻塞方式。在阻塞方式下,收发数据的函数在被调用后一直要到传送完毕或者出错才能返回;在阻塞期间,除了等待网络操作的完成不能进行任何操作。对于非阻塞方式,函数被调用后立即返回;当网络操作传送完成后,由Winsock给应用程序发送一个消息,通知操作完成,此时可以根据发送的消息的参数判断操作是否正常。在编程时,应尽量使用非阻塞方式。因为在阻塞方式下,用户可能会因为长时间的等待而失去耐心继而关闭应用程序的主窗口,这样当网络操作的函数从Winsock的动态链接库中返回时,主程序已经从内存中删除,可能会造成内存的异常,虽然现在的操作系统已经可以从系统级正确地处理这种内存问题,但还是建议这种情况的发生。Winsock基本的API(1)WSAStartup():初始化。函数原型:IntPASCALFARWSAStartup(WORDwVersionRequested,LPWSDATAlpWSAData);WindowsSocket由DLL形式提供,为了完成一系列初始化操作,每一个使用WindowsSocket的应用程序都必须进行WSASstartup()函数调用,并只有在成功地完成调用之后才能使用Socket。其中参数wVersionRequested表示欲使用的WindowsSocketAPI的版本:这是一个WORD类型的整数,它的高位字节定义是次版本号,低位字节定义的是主版本号。lpWSAData:指向WSADATA资料的指针。成功返回0。(2)socket();创建一个Socket。函数原型:SOCKETsocketintaf,inttype,intproctocol);所有的通信在建立之前都要创建一个Socket,该函数的功能与文件操作中的fopen类似。Af值addressfamily(地址族),一般都填AF_INET,表示是在Internet上的Socket;type是Socket的类型,当采用流连接方式时用SOCK_STREAM,用数据报文方式时用SOCK_DGRAM。Proctocol一般都为0,表示用对两种类型的Socket分别采用缺省的TCP和UDP传输协议。函数的返回值是由Winsock订id一种数据类型SOCKET,它实际上就是个整型数据在Socket创建成功时,代表Winsock分配给程序的Socket编号,后面调用传输函数时,就可以把它像文件指针一样引用。如果Socket建立失败,返回值为INVALID_SOCKET。(3)bind();创建的Socket指定通信对象。函数原型:Intbind(SOCKETs,conststructsocketsockaddr_in*addr,intaddrlen);创建了Socket之后,就应该选定通信的对象。首先是自己的程序要与网上的哪台计算机通话;其次,在多任务的系统下,该计算机上可能会有几个程序在工作,必须指出要与哪个程序通信。前者可以通过Internet的网络IP地址来确定,而后者是通过端口号来确定。用端口号来表示同一台计算机上不同的应用程序,端口号可以为0~65536,不同功能的通信程序使用不同的端口号,这样一台计算机上可以有几个程序同时使用一个IP地址通信而不互相干扰,IP地址与端口号的关系好像是电话总机号码与分机号码的关系一样。(4)listen():设置等待连接状态。函数原型:Intlisten(SOCKETs,intbacklog);对于服务器的程序,当申请到Socket,并指定通信对象为INADDR_ANY之后,就应该等待一个客户机的程序来要求连接。Listen()就是一个把一个Socket设置这种状态的函数。参数backlog是等待连接的队列长度,可取1~5。如果当某个客户程序要求连接时,服务器已与其他客户程序连接,则后来的连接请求会被放在队列中,等待服务器空闲的时候再与之连接。当队列达到指定的长度(backlog的值)时,再来的连接请求都将被拒绝。(5)accept():接受连接请求。函数原型:SOCKETaccept(SOCKETs,structsockaddr_in*addr,int*addrlen);当没有连接请求时,对于阻塞方式,就进入等待状态,直至有一个请求到达为止。Accept()在接受到连接请求之后,会为这个连接建立一个新的Socket来与对方通信,并把它作为返回值。新建的Socket与原来的Socket有相同的特性,包括端口号。原来的Socket被释放,用于继续等待其他的连接请求,而生成的Socket才是与客户端进行通信的实际Socket。所以一般将参数中的SOCKET称作“监听“Socket,它只负责接受连接,而不负责通话;而对于accept函数返回的SOCKET,把它称作“会话”Socket,它只负责与客户端通话。参数中的指针addr和addlen用来返回客户机的sockaddr-in结构体,够过addr可得到客户机的IP地址和连接端口。注意:bind()、listen()和accept()函数一般都用于服务程序,属于被动等待点函数,要进行主动的连接需要利用connect()函数。函数原型:Intconnect(SOCKETs,structsockaddr_in*name,intnamlen)其中s是刚才建立的Socket,name与namelen的含义与使用方法与bind()相同,用来指定通信对象。连接失败该函数会返回SOCKET-ERROR.(6)send()/recv():发送、接收数据。函数原型:Intsend(SOCKETs,char*buf,intlen,intflags)Intrecv(SOCKETs,char*buf,intlen,intflags)S是连接用的。Socket、buf和len是发送或接收的的数据包及其长度,参数flags一般取0.recv()函数实际上是读取send()函数发过来的一个数据包。当读到的数据字节少于规定接收的数目时,就把数据全部接收,并返回实际接收到的字节数,当读到的数据多于规定值时,在流方式下剩余的数据由下个recv()读出,在数据报文方式下多余的数据将被丢弃。这两个函数在出错时都返回SOCKET_ERROR。以数据报文方式通信的Socket,由于事先不用建立连接,所以可以跳过connect()而直接用recvfrom和sendto两个函数通信:Intrecvfrom(SOCKETs,char*buf,intlen,intflags,structsocket_infrom,int*fromlen);Intsendto(SOCKETs,char*buf,intlen,intflags,structsockaddr_into,int*tolen)其中from、fromlen、to、tolen的含义和用法与bind()和connect()中的相同,分别表示接收和发送数据的对象。(7)closesocket():关闭socket。函数原型:Closesocket(SOCKETs);通信结束,关闭指定的Socket。以上API在调用时的过程如下:Server端Client端调用WSAStartup()初始化Winsock调用WSAStartup()初始化Winsock调用socket创建一个会话socket调用connect()与Server连接调用send()和recv()进行对话调用closesocket()关闭对话调用WSAStartup()初始化Winsock调用socket创建一个监听socket调用bind()为监听socket指定通信对象调用closesocket()关闭对话调用send()和recv()进行对话调用accept()接收连接并生成会话socket调用listen()设定等待连接状态图1面向连接的流方式过程调用WSAStartup()初始化Winsock调用WSAStartup()初始化Winsock调用socket创建一个会话socket调用sendto()和recvfrom()进行通信调用closesocket()关闭socket图2面向无连接的数据报过程

ping程序的功能及其相关网络协议ping程序的功能Ping程序通过主机向远程计算机发出ICMP回显请求,远程计算机拦截这个请求,然后生成一条回显应答消息,通过网络传给主机。但是如果因为一些原因造成不能抵达目标主机,就会生成对应的ICMP错误消息,由原来打算建立通信的那个路径上某处的一个路由器返回。如果与远程主机的物理性连接并不存在问题,但是远程主机已经关机或没有设置对网络时间的做出相应,便需由自己的程序来执行超时检测,侦测出这样的情况。以检查网络是否能够连通,从而可以很好地帮助我们分析判定网络故障。它所利用的原理是这样的:网络上的机器都有唯一确定的IP地址,按照缺省设置,Windows上运行的Ping命令给目标IP地址发送4个ICMP(网间控制报文协议)回送请求,每个32字节数据,如果一切正常,应能得到4个回送应答。根据返回的数据包我们可以确定目标主机的存在以及是否可达。在本程序中,可以通过两种方式测试目标主机的连通性:通过ip地址或者主机名。前者较简单,若通过主机名测试连通性的话,首先要通过数据库中的地址主机名表查询并解析其对应的ip地址,然后进一步测试连通性。如果可以正常连通,则按照先后的顺序返回4个应答帧,显示所用的时间,并且提示完成ping测试。另外还可以通过复选框简单的记录路由器的情况。如果不能正常连通,则显示timeout,并提示测试完成。ping的相关协议支持Ping的协议中ICMP是最关键的一个。ICMP全称InternetControlMessageProtocol(网际控制信息协议)。在网络体系结构的各层次中,都需要控制,而不同的层次有不同的分工和控制内容,IP层的控制功能是最复杂的,主要负责差错控制、拥塞控制等,任何控制都是建立在信息的基础之上的,在基于IP数据报的网络体系中,网关必须自己处理数据报的传输工作,而IP协议自身没有内在机制来获取差错信息并处理。为了处理这些错误,TCP/IP设计了ICMP协议,当某个网关发现传输错误时,立即向信源主机发送ICMP报文,报告出错信息,让信源主机采取相应处理措施,它是一种差错和控制报文协议,不仅用于传输差错报文,还传输控制报文。

ICMP报文包含在IP数据报中,属于IP的一个用户,IP头部就在ICMP报文的前面,所以一个ICMP报文包括IP头部、ICMP头部和ICMP报文,IP头部的Protocol值为1就说明这是一个ICMP报文,ICMP头部中的类型(Type)域用于说明ICMP报文的作用及格式,此外还有一个代码(Code)域用于详细说明某种ICMP报文的类型,所有数据都在ICMP头部后面。

常见的ICMP报文主要有:响应请求目标不可到达、源抑制和超时报文,以及时间戳。

ping程序的设计方案ping程序的工作流程设计方案:ping两台主机要发送消息,源主机要有发送区和接收区,因此要为send_buf和recv_buf分配内存;创建icmp的包头;编写算法用于计算icmp包的校验和,但在校验之前务必将icmp包头的checksum字段置为0;初始化rawsocket,设置ttl,初始化dest,如果返回值为0表示失败;初始化icmp的包头,给data部分填充数据,最后计算整个包的检验和;发送生成的icmp包,返回值小于0,表示失败;接收icmp包,返回值小于0,表示失败;对收到的icmp解码,如果返回值为-2,表示忽略,-1表示失败,0表示成功;工作结束,显示运行Ping命令的统计结果。选择开发环境,编译源程序我选择了VC6.0的开发环境,并且创建工程ping和cpp文件iping.cpp,并由以下代码编译出可执行文件iping.exe。//aprogamwrittenby20100610040225#pragmacomment(lib,"ws2_32.lib")#pragmapack(4)//字节对齐#include"winsock2.h"#include"stdlib.h"#include"stdio.h"#defineICMP_ECHO8//ICMP回显请求#defineICMP_ECHOREPLY0//ICMP回显应答#defineICMP_MIN8//ICMP数据包最短为8个字节//定义IP头部typedefstructiphdr{ unsignedinth_len:4;//头部长 unsignedintversion:4;//版本号 unsignedchartos;//服务类型 unsignedshortident;//标识 unsignedshorttotal_len;//总长度 unsignedshortfrag_and_flags;//标志 unsignedcharttl;//生存时间 unsignedcharproto;//上层协议 unsignedshortchecksum;//校验和 unsignedintsourceIP;//源IP unsignedintdestIP;//目的IP}IpHeader;//定义ICMP头部typedefstructicmphdr{ BYTEi_type;//类型 BYTEi_code;//代码 USHORTi_cksum;//校验和 USHORTi_id;//标识 USHORTi_seq;//序列号 ULONGtimestamp;//数据}IcmpHeader;#defineSTATUS_FAILED0xFFFF#defineDEF_PACKET_SIZE32//默认数据包长度#defineDEF_PACKET_NUMBER4//默认发送ICMP请求的次数#defineMAX_PACKET1024//数据包最大长度#definexmalloc(s)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))//分配内存#definexfree(p)HeapFree(GetProcessHeap(),0,(p))//释放内存//填充icmp数据包voidfill_icmp_data(char*,int);//计算校验和USHORTchecksum(USHORT*,int);//收到数据后解码intdecode_resp(char*,int,structsockaddr_in*);//提示用户该程序使用方法voidUsage(char*progname){ fprintf(stderr,"\t命令所在目录:\n"); fprintf(stderr,"\t%s\n",progname); printf("\t你需要在cmd中进入该目录直接使用iping指令,例如:iping\n"); ExitProcess(STATUS_FAILED);}intmain(intargc,char**argv){ system("cls"); printf("\n\n\n===============AsmallprogramwritenbyXXXXXXXX==============\n"); WSADATAwsaData;//初始化windowssocket需要的参数 SOCKETsockRaw;//原始套接字 structsockaddr_indest,from;//源、目的IP地址 structhostent*hp;//指针指向包含主机名、地址列表等信息的结构体 intbread,datasize,times; intfromlen=sizeof(from); inttimeout=1000;//超时时间1000ms intstatistic=0;//用于统计 char*dest_ip; char*icmp_data; char*recvbuf; unsignedintaddr=0; USHORTseq_no=0; if(WSAStartup(MAKEWORD(2,1),&wsaData)!=0){ fprintf(stderr,"WSAStartupfailed:%d\n",GetLastError()); ExitProcess(STATUS_FAILED); } //使用方法不对时显示提示信息 if(argc<2){ Usage(argv[0]); } //创建原始套接字 sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED); //注:为了使用发送接收超时设置(即设置SO_RCVTIMEO,SO_SNDTIMEO), //必须将标志位设为WSA_FLAG_OVERLAPPED! //创建原始套接字不成功 if(sockRaw==INVALID_SOCKET){ fprintf(stderr,"WSASocket()failed:%d\n",WSAGetLastError()); ExitProcess(STATUS_FAILED); } //设定发送超时时间 bread=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout)); if(bread==SOCKET_ERROR){ fprintf(stderr,"failedtosetrecvtimeout:%d\n",WSAGetLastError()); ExitProcess(STATUS_FAILED); } //设定接收数据超时时间 timeout=1000; bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout)); if(bread==SOCKET_ERROR){ fprintf(stderr,"failedtosetsendtimeout:%d\n",WSAGetLastError()); ExitProcess(STATUS_FAILED); } memset(&dest,0,sizeof(dest)); //解析用户输入的目标地址 hp=gethostbyname(argv[1]); if(!hp){ addr=inet_addr(argv[1]); } //非法输入 if((!hp)&&(addr==INADDR_NONE)){ fprintf(stderr,"Unabletoresolve%s\n",argv[1]); ExitProcess(STATUS_FAILED); } //记录目标主机信息的结构体 //地址 if(hp!=NULL) memcpy(&(dest.sin_addr),hp->h_addr,hp->h_length); else dest.sin_addr.s_addr=addr; //协议族 if(hp) dest.sin_family=hp->h_addrtype; else dest.sin_family=AF_INET; //目标IP dest_ip=inet_ntoa(dest.sin_addr); //除了目标地址,还给出了Ping的次数 if(argc>2) { times=atoi(argv[2]); if(times==0) times=DEF_PACKET_NUMBER; } elsetimes=DEF_PACKET_NUMBER; //还给出了数据大小 if(argc>3) { datasize=atoi(argv[3]); //给的是0,则用默认数据包大小 if(datasize==0) datasize=DEF_PACKET_SIZE; //用户给出的数据包大小太大 if(datasize>1024) { fprintf(stderr,"WARNING:data_sizeistoolarge!\n"); datasize=DEF_PACKET_SIZE; } } elsedatasize=DEF_PACKET_SIZE; datasize+=sizeof(IcmpHeader); icmp_data=(char*)xmalloc(MAX_PACKET); recvbuf=(char*)xmalloc(MAX_PACKET); if(!icmp_data){ fprintf(stderr,"HeapAllocfailed%d\n",GetLastError()); ExitProcess(STATUS_FAILED); } memset(icmp_data,0,MAX_PACKET); //填充ICMP数据包,类型、代码、标识等 fill_icmp_data(icmp_data,datasize); //提示正在ping目标主机 fprintf(stdout,"\nPinging%s\n\n",dest_ip); //Ping多次 for(inti=0;i<times;i++) { intbwrote; //准备ICMP包头部数据 ((IcmpHeader*)icmp_data)->i_cksum=0; //取得以毫秒为单位的计算机启动后经历的时间间隔 ((IcmpHeader*)icmp_data)->timestamp=GetTickCount(); ((IcmpHeader*)icmp_data)->i_seq=seq_no++;//序列号递增 ((IcmpHeader*)icmp_data)->i_cksum=checksum((USHORT*)icmp_data,datasize);//计算校验和 //发送ICMP数据包 bwrote=sendto(sockRaw,icmp_data,datasize,0,(structsockaddr*)&dest,sizeof(dest)); //发送失败 if(bwrote==SOCKET_ERROR){ if(WSAGetLastError()==WSAETIMEDOUT){ printf("Requesttimedout.\n"); continue; } fprintf(stderr,"sendtofailed:%d\n",WSAGetLastError()); ExitProcess(STATUS_FAILED); } if(bwrote<datasize){ fprintf(stdout,"Wrote%dbytes\n",bwrote); } //接收应答数据 bread=recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(structsockaddr*)&from,&fromlen); //接收失败 if(bread==SOCKET_ERROR){ if(WSAGetLastError()==WSAETIMEDOUT){ printf("Requesttimedout.\n"); continue; } fprintf(stderr,"recvfromfailed:%d\n",WSAGetLastError()); ExitProcess(STATUS_FAILED); } //成功解码 if(!decode_resp(recvbuf,bread,&from)) statistic++;//记录成功接收响应数据包的次数 Sleep(1000); } //统计运行Ping命令的统计结果 fprintf(stdout,"\nPingstatisticsfor%s\n",dest_ip); fprintf(stdout,"Packets:Sent=%d,Received=%d,Lost=%d(%2.0f%%loss)\n",times, statistic,(times-statistic),(float)(times-statistic)/times*100); printf("\n===============AsmallprogramwritenbyXXXXXXXX==============\n");WSACleanup(); return0;}//收到响应IP数据包后,对其进行解码intdecode_resp(char*buf,intbytes,structsockaddr_in*from){ IpHeader*iphdr; IcmpHeader*icmphdr; unsignedshortiphdrlen; iphdr=(IpHeader*)buf; iphdrlen=(iphdr->h_len)*4;//头部占几个节字节 if(bytes<iphdrlen+ICMP_MIN){ printf("Toofewbytesfrom%s\n",inet_ntoa(from->sin_addr)); } //找到ICMP数据包开始的地方 icmphdr=(IcmpHeader*)(buf+iphdrlen); if(icmphdr->i_type!=ICMP_ECHOREPLY){ fprintf(stderr,"non-echotype%drecvd\n",icmphdr->i_type); return1; } //是不是发给本程序的数据包 if(icmphdr->i_id!=(USHORT)GetCurrentProcessId()){ fprintf(stderr,"someoneelse''spacket!\n"); return1; } printf("%dbytesfrom%s:",bytes,inet_ntoa(from->sin_addr)); printf("icmp_seq=%d.",icmphdr->i_seq); printf("time:%dms",GetTickCount()-icmphdr->timestamp);//发送到接收过程的经历的时间 printf("\n"); return0;}//计算校验和USHORTchecksum(USHORT*buffer,intsize){ unsignedlongcksum=0; while(size>1){ cksum+=*buffer++; size-=sizeof(USHORT); } if(size){ cksum+=*(UCHAR*)buffer; } cksum=(cksum>>16)+(cksum&0xffff); cksum+=(cksum>>16); return(USHORT)(~cksum);}//填充ICMP数据包voidfill_icmp_data(char*icmp_data,intdatasize){ IcmpHeader*icmp_hdr; char*datapart

温馨提示

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

评论

0/150

提交评论