c++实现ping程序.doc_第1页
c++实现ping程序.doc_第2页
c++实现ping程序.doc_第3页
c++实现ping程序.doc_第4页
c++实现ping程序.doc_第5页
全文预览已结束

下载本文档

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

文档简介

一、 实验目的基于ICMP请求与应答实现ping程序,用来测试网络的可达性。二、实验要求1、显示ping的字节数(Bytes)2、显示ping的往返时间(Times)3、显示ping的生存时间(TTL)3、网络不可达时显示requested out!三、实验原理Ping命令是用来查看网络上另一个主机系统的网络是否正常的工具。其原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将报文一模一样地传送给发送者。其所使用的协议是ICMP,ICMP(网际控制报文协议)的功能很多,ping程序所用的是ICMP请求与应答报文。具体的实现还是很简单的,首先要考虑IP数据报和ICMP数据报的区别,然后这两种数据报的结构,IP数据报的头部有(版本号,头长度,服务类型,总长度,标识,标志,片偏移,生存时间,上层协议标识,头部校验和,源IP地址,目标IP地址),这里只考虑20字节的头部,然后就是ICMP报文,ICMP的功能不同,他的头部结构也就不同,请求与应答报文的结构:类型(8位),代码(8位),校验和(16位),标识符(16位),进程ID(16位),进程ID(16位),时间 (32位),这里的各部分的位数很重要,所需要的生存时间TTL就是从IP数据报头取得的。 四、实验代码#include #include using namespace std;#pragma comment(lib,WS2_32) #define DEF_BUF_SIZE 1024 #define IP_HEADER_SIZE 20 #define ICMP_HEADER_SIZE 12 typedef struct _ICMP_HEADER unsigned char bType; /(8位)类型 unsigned char bCode; /(8位)代码 unsigned short nCheckSum; /(16位)校验各 unsigned short nId; /(16位)进程ID unsigned short nSequence; /(16位)序号 unsigned long nTimeStamp; /(32位)时间 ICMP_HEADER, *PICMP_HEADER; struct IPHeader unsigned char m_byVerHLen; /4位版本+4位首部长度 unsigned char m_byTOS; /(8位)服务类型 unsigned short m_usTotalLen; /(16位)总长度 unsigned short m_usID; /(16位)标识 unsigned short m_usFlagFragOffset; /3位标志+13位片偏移 unsigned char m_byTTL; /TTL unsigned char m_byProtocol; /协议 unsigned short m_usHChecksum; /首部检验和 unsigned long m_ulSrcIP; /(32位)源IP地址 unsigned long m_ulDestIP; /(32位)目的IP地址;/计算校验和(二进制反码求和)unsigned short checksum(PICMP_HEADER picmp,int length) /length表示icmp回送请求报文的长度long sum=0;unsigned short *icmp=(unsigned short*)picmp;while(length1)sum+=*icmp+;sum=(sum&0xffff)+(sum16); /与高16位的进位数相加length-=2;if(length=1) / 报文长度为奇数,最后剩下一个字节sum+=*(unsigned char*)icmp;while(sum16) /进位数与部分和求和sum=(sum&0xffff)+(sum16);return (unsigned short)sum; /取反USHORT GetCheckSum(LPBYTE lpBuff, DWORD dwSize) DWORD dwCheckSum = 0; USHORT* lpWord = (USHORT*)lpBuff; while(dwSize 1) dwCheckSum += *lpWord+; dwSize -= 2; if(dwSize =1) dwCheckSum += *(LPBYTE)lpBuff); dwCheckSum = (dwCheckSum 16) + (dwCheckSum & 0XFFFF); return (USHORT)(dwCheckSum); bool Ping(char* lpDestIP) sockaddr_in DestSockAddr; DestSockAddr.sin_family = AF_INET; DestSockAddr.sin_addr.S_un.S_addr = inet_addr(lpDestIP); DestSockAddr.sin_port = htons(0); char ICMPPackICMP_HEADER_SIZE = 0; PICMP_HEADER pICMPHeader = (PICMP_HEADER)ICMPPack; pICMPHeader-bType = 8; pICMPHeader-bCode = 0; pICMPHeader-nId = (unsigned short) GetCurrentProcessId(); pICMPHeader-nCheckSum = 0; pICMPHeader-nTimeStamp = 0; WORD version = MAKEWORD(2, 2); WSADATA wsaData; if(WSAStartup(version, &wsaData) != 0) printf(WSAStartup errorn); return FALSE; SOCKET s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); int nTime = 1000;/设置接收超时时间int ret = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTime, sizeof(nTime); char szRcvBuffDEF_BUF_SIZE; sockaddr_in SourceSockAddr; for(int i=0; i nCheckSum = 0; pICMPHeader-nSequence = i; pICMPHeader-nTimeStamp = GetTickCount(); pICMPHeader-nCheckSum = GetCheckSum(LPBYTE)(ICMPPack), ICMP_HEADER_SIZE); unsigned short x=GetCheckSum(LPBYTE)(ICMPPack), ICMP_HEADER_SIZE); int nRet = sendto(s, ICMPPack, ICMP_HEADER_SIZE, 0, (SOCKADDR*)&DestSockAddr, sizeof(DestSockAddr); if(nRet = SOCKET_ERROR) printf(send error.n); return FALSE; int nLen = sizeof(sockaddr_in); if(nRet = SOCKET_ERROR) int nError = WSAGetLastError(); printf(Recv Error:%d.n, nError); return FALSE; nRet = recvfrom(s, szRcvBuff,DEF_BUF_SIZE,0,(SOCKADDR*)&SourceSockAddr,&nLen); if(nRet = SOCKET_ERROR) coutRequest timed out!nTimeStamp; printf(从目标地址传回: %s bytes=%d time=%dms TTL=%dn, inet_ntoa(SourceSock

温馨提示

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

最新文档

评论

0/150

提交评论