1课程设计课程名称__网络工程课程设计题目名称___PING程序设计题目名称文件传输协议的简单设计题目名称数据链路层协议的设计学生学院__专业班级___网络工程学号___学生姓名____林清鑫_____指导教师____高明琴______2009年12月25日2PING目录1具体设计任务……………………………………………………………………31.1实验目的……………………………………………………………………31.2实验内容和要求..............................................31.2.1实验内容..............................................31.2.2具体要求..............................................31.3实验主要仪器设备和材料..............................................42工作原理及设计方案..............................................42.1PING的工作原理.............................................42.2原理框图....................................................53主要代码及其功能................................................64结果分析.......................................................105思考题.........................................................116心得体会........................................................123课程设计一:PING程序设计1设计任务目的及要求1.1设计目的PING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作。由计算机网络课程知道,ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。课程设计中选取PING程序的设计,其目的是希望同学们通过PING程序的设计,能初步掌握TCP/IP网络协议的基本实现方法,对网络的实现机制有进一步的认识。1.2设计要求1、RAW模式的SOCKET编程PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET编程。熟悉SOCKET的编程,包括基本的系统调用如SOCKET、BIND等;2、具体内容1)定义数据结构需要定义好IP数据报、ICMP包等相关的数据结构;2)程序实现在WINDOWS环境下实现PING程序;3)程序要求在命令提示符下输入:PINGΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ其中ΧΧΧ为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要求。不带开关变量时,要求返回4次响应。返回信息的格式:REPLYFROMΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ或4REQUESTTimeOut(无法PING通的情况)。1.3实验环境Pc机一台(可以与其他机联通或者可以上网)操作系统为windowsxp软件为vc6.0Windows环境下2工作原理及设计方案2.1PING的工作原理ping程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。ping使用的是ICMP协议,它发送ICMP回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议。因此,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因。ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。而前16bit就组成了ICMP所要传递的信息。PING利用ICMP协议包来侦测另一个主机是否可达。原理是用类型码为0的ICMP发请求,受到请求的主机则用类型码为8的ICMP回应。ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况。52.2原理框图开始发送数据包?接收数据包?解析数据包?结束输出失败信息结束函数输出失败信息结束函数创建套接字判断是不是无限?输入域名、大小和次数解析域名填写ICMP数据包?计算校验和输出失败信息结束函数否是是是否否否是是输出失败信息结束程序3否6.3程序源代码ICMP头结构typedefstructicmphdr{BYTEi_type;//数据的类型BYTEi_code;//subcode类型USHORTi_cksum;//校验和USHORTi_id;//idUSHORTi_seq;//序号ULONGtimestamp;}IcmpHeader;IP头结构typedefstructiphdr{unsignedinth_len:4;//长度unsignedintversion:4;//版本unsignedchartos;//服务类型unsignedshorttotal_len;//实际长度unsignedshortident;//标识unsignedshortfrag_and_flags;//标志unsignedcharttl;//生存时间unsignedcharproto;//协议(TCP,UDPetc)unsignedshortchecksum;//IP校验unsignedintsourceIP;unsignedintdestIP;}IpHeader;填写ICMP数据包*voidfill_icmp_data(char*icmp_data,intdatasize)//填充ICMP{IcmpHeader*icmp_hdr;char*datapart;icmp_hdr=(IcmpHeader*)icmp_data;icmp_hdr-i_type=ICMP_ECHO;icmp_hdr-i_code=0;icmp_hdr-i_id=(USHORT)GetCurrentProcessId()icmp_hdr-i_cksum=0;icmp_hdr-i_seq=0;datapart=icmp_data+sizeof(IcmpHeader);//数据段地址memset(datapart,0,datasize-sizeof(IcmpHeader));}计算校验和USHORTchecksum(USHORT*buffer,intsize)//求校验和{unsignedlongcksum=0;while(size1){cksum+=*buffer++;size-=sizeof(USHORT);}if(size){cksum+=*(UCHAR*)buffer;}cksum=(cksum16)+(cksum&0xffff);cksum+=(cksum16);return(USHORT)(~cksum);}7数据包解码Intdecode_resp(char*buf,intbytes,structsockaddr_in*from,unsignedlong&arrivetime,CListBox*info)//解码{IpHeader*iphdr;IcmpHeader*icmphdr;unsignedshortiphdrlen;//ip头的长度CStringstr,str1,str2;iphdr=(IpHeader*)buf;iphdrlen=(iphdr-h_len)*4;if(bytesiphdrlen+ICMP_MIN){str1=inet_ntoa(from-sin_addr);info-AddString(Toofewbytesfrom+str1);info-PostMessage(WM_VSCROLL,SB_BOTTOM,0);}//str.Format();icmphdr=(IcmpHeader*)(buf+iphdrlen);if(icmphdr-i_type!=ICMP_ECHOREPLY){str1.Format(%d,icmphdr-i_type);info-AddString(non-echotype+str1+recvd);info-PostMessage(WM_VSCROLL,SB_BOTTOM,0);return1;}if(icmphdr-i_id!=(USHORT)GetCurrentProcessId()){info-AddString(someoneelse'spacket!);info-PostMessage(WM_VSCROLL,SB_BOTTOM,0);return1;}intk=(int)iphdr-ttl;CStringttl;ttl.Format(%d,k);str.Format(%d,(int)bytes);str1.Format(%d,icmphdr-i_seq);str2.Format(%d,arrivetime-icmphdr-timestamp);info-AddString(str+bytesfrom+:+inet_ntoa(from-sin_addr)+icmp_seq=+str1+'.'+time:+str2+ms.+TTL+ttl);info-PostMessage(WM_VSCROLL,SB_BOTTOM,0);Sleep(1000);return0;}8if(bag-select==1){bag-IPCtrl-GetAddress(addr);addr=(DWORD)htonl((unsignedlong)addr);dest.sin_addr=*(in_addr*)&addr;hp=gethostbyaddr((char*)&addr,16,AF_INET);if(hp!=NULL){(bag-dnsCtrl)-SetSel(0,-1,FALSE);(bag-dnsCtrl)-ReplaceSel(hp-h_name);}if((!hp)&&(addr==INADDR_NONE)){str=inet_ntoa(dest.sin_addr);bag-infolist-AddString(Unabletoresolve+str);return0;}}//初始化destif(hp)dest.sin_family=hp-h_addrtype;elsedest.sin_family=AF_INET;//获取IP或域名,并显示dest_ip=inet_ntoa(dest.sin_addr);//将网络地址转换成“.”点隔的字符串格式times=DEF_PACKET_NUMBER;datasize=DEF_PACKET_SIZE;datasize+=sizeof(IcmpHeader);//数据段的大小icmp_data=(char*)xmalloc(MAX_PACKET);//为icmp分配内存recvbuf=(char*)xmalloc(MAX_PACKET);if(!icmp_data){str.Format(%d,GetLastError());bag-infolist-AddString(HeapAllocfailed+str);return0;}..........