欢迎来到天天文库
浏览记录
ID:47426699
大小:33.91 KB
页数:5页
时间:2020-01-10
《c++实现ping程序》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、一、实验目的基于ICMP请求与应答实现ping程序,用来测试网络的可达性。二、实验要求1、显示ping的字节数(Bytes)2、显示ping的往返时间(Times)3、显示ping的生存时间(TTL)3、网络不可达时显示requestedout!三、实验原理Ping命令是用来查看网络上另一个主机系统的网络是否正常的工具。其原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将报文一模一样地传送给发送者。其所使用的协议是ICMP,ICMP(网际控制报文协议)的功能很多,ping程序所用的是ICM
2、P请求与应答报文。具体的实现还是很简单的,首先要考虑IP数据报和ICMP数据报的区别,然后这两种数据报的结构,IP数据报的头部有(版本号,头长度,服务类型,总长度,标识,标志,片偏移,生存时间,上层协议标识,头部校验和,源IP地址,目标IP地址),这里只考虑20字节的头部,然后就是ICMP报文,ICMP的功能不同,他的头部结构也就不同,请求与应答报文的结构:类型(8位),代码(8位),校验和(16位),标识符(16位),进程ID(16位),进程ID(16位),时间(32位),这里的各部分的位数很重要,所需要的生存时间
3、TTL就是从IP数据报头取得的。四、实验代码#include#includeusingnamespacestd;#pragmacomment(lib,"WS2_32")#defineDEF_BUF_SIZE1024#defineIP_HEADER_SIZE20#defineICMP_HEADER_SIZE12typedefstruct_ICMP_HEADER{unsignedcharbType;//(8位)类型unsignedcharbCode;//(8位)代码unsign
4、edshortnCheckSum;//(16位)校验各unsignedshortnId;//(16位)进程IDunsignedshortnSequence;//(16位)序号unsignedlongnTimeStamp;//(32位)时间}ICMP_HEADER,*PICMP_HEADER;structIPHeader{unsignedcharm_byVerHLen;//4位版本+4位首部长度unsignedcharm_byTOS;//(8位)服务类型unsignedshortm_usTotalLen;//(16位)
5、总长度unsignedshortm_usID;//(16位)标识unsignedshortm_usFlagFragOffset;//3位标志+13位片偏移unsignedcharm_byTTL;//TTLunsignedcharm_byProtocol;//协议unsignedshortm_usHChecksum;//首部检验和unsignedlongm_ulSrcIP;//(32位)源IP地址unsignedlongm_ulDestIP;//(32位)目的IP地址};//计算校验和(二进制反码求和)unsigned
6、shortchecksum(PICMP_HEADERpicmp,intlength){//length表示icmp回送请求报文的长度longsum=0;unsignedshort*icmp=(unsignedshort*)picmp;while(length>1){sum+=*icmp++;sum=(sum&0xffff)+(sum>>16);//与高16位的进位数相加length-=2;}if(length==1){//报文长度为奇数,最后剩下一个字节sum+=*(unsignedchar*)icmp;}while
7、(sum>>16)//进位数与部分和求和sum=(sum&&0xffff)+(sum>>16);return(unsignedshort)~sum;//取反}USHORTGetCheckSum(LPBYTElpBuff,DWORDdwSize){DWORDdwCheckSum=0;USHORT*lpWord=(USHORT*)lpBuff;while(dwSize>1){dwCheckSum+=*lpWord++;dwSize-=2;}if(dwSize==1)dwCheckSum+=*((LPBYTE)lpBuff
8、);dwCheckSum=(dwCheckSum>>16)+(dwCheckSum&0XFFFF);return(USHORT)(~dwCheckSum);}boolPing(char*lpDestIP){sockaddr_inDestSockAddr;DestSockAddr.sin_family=AF_INET;DestSockAddr.s
此文档下载收益归作者所有