C++代码实现网络Ping功能_第1页
C++代码实现网络Ping功能_第2页
C++代码实现网络Ping功能_第3页
C++代码实现网络Ping功能_第4页
C++代码实现网络Ping功能_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

第C++代码实现网络Ping功能目录(一)main.cpp文件(二)ping.h文件(1)IP头结构体:(2)ICMP头结构体:(3)ICMP响应报文结构体:(4)Ping类及相关变量的定义:(三)ping.cpp文件(1)char*m_szICMPData;BOOLm_bIsInitSucc;(2)BOOLPing(char*szDestIP,PingReply*pPingReply=NULL,DWORDdwTimeout=2000);(3)BOOLPingCore(DWORDdwDestIP,PingReply*pPingReply,DWORDdwTimeout);(4)计算检验和(5)计算毫秒级别的时间差ping:这个Ping命令被送到本地计算机的IP软件,该命令永不退出该计算机。

localhost是个操作系统的网络保留名,是的别名。

ping——对这个域名执行Ping命令,你的计算机必须先将域名转换成IP地址,通常是通过DNS服务器。

(一)main.cpp文件

//ConsoleApplication3.cpp:定义控制台应用程序的入口点。

//程序应用:ping命令是向目的主机发送ICMP报文,检验本地主机和远程的目的主机是否连接

#includewinsock2.h

#includestdio.h

#include"ping.h"

intmain(void)

CPingobjPing;//CPing类与对象

char*szDestIP="";//字符IP地址//这个Ping命令被送到本地计算机的IP软件,该命令永不退出该计算机。localhost是个操作系统的网络保留名,是的别名。//ping——对这个域名执行Ping命令,你的计算机必须先将域名转换成IP地址,通常是通过DNS服务器。

PingReplyreply;//PingReply类与对象

printf("Pinging%swith%dbytesofdata:\n",szDestIP,DEF_PACKET_SIZE);//ping远端IP地址,32字节的数据

while(TRUE)

objPing.Ping(szDestIP,reply);//远端IP地址不为空(NULL),就返回true表示需要响应报文。远端IP空时不需要响应报文false。

printf("Replyfrom%s:bytes=%dtime=%ldmsTTL=%ld\n",szDestIP,reply.m_dwBytes,reply.m_dwRoundTripTime,reply.m_dwTTL);//字节数,时间,TTL生存时间

Sleep(500);

return0;

}

(二)ping.h文件

(1)IP头结构体:

IHL:首部长度。因为IP的头部不是定长的,所以需要这个信息进行IP包的解析,从而找到Data字段的起始点。

另外注意这个IHL是以4个字节为单位的,所以首部实际长度是IHL*4字节。

TimetoLive:生存时间,这个就是TTL了。

Data:这部分是IP包的数据,也就是ICMP的报文内容。

//1.IP头结构体:20字节

structIPHeader

BYTEm_byVerHLen;//4位版本Version+4位首部长度IHL1B

BYTEm_byTOS;//服务类型1B=16b

USHORTm_usTotalLen;//总长度2B=16b

USHORTm_usID;//标识2B=16b

USHORTm_usFlagFragOffset;//3位标志+13位片偏移=16位2B=16b

BYTEm_byTTL;//TTL生存时间1B=8b

BYTEm_byProtocol;//协议1B=8b为1时表示是ICMP报文

USHORTm_usHChecksum;//首部检验和2B=16b

ULONGm_ulSrcIP;//源IP地址4B=32b

ULONGm_ulDestIP;//目的IP地址4B=32b

};

(2)ICMP头结构体:

类型Type、代码Code、校验和、标识符、序列号、ICMP数据

//ICMP报文由首部8B和数据段组成。

//首部为定长的8个字节,前4个字节是通用部分(类型1B/代码1B/校验和2B),后4个字节随报文类型的不同有所差异。

//2.ICMP头结构体(标准ICMP头为8字节)

structICMPHeader

BYTEm_byType;//类型1Btype=8表示响应请求报文,type=0表示响应应答报文。

BYTEm_byCode;//代码1B与type组合,表示具体的信息

USHORTm_usChecksum;//检验和2B整个ICMP报文的检验和,包括Type、Code、...、Data。

USHORTm_usID;//标识符2B=16bits用于标识本进程

USHORTm_usSeq;//序列号2B=16bits用于判断回显应答数据报。

ULONGm_ulTimeStamp;//时间戳(非标准ICMP头部)4B//统计ping的往返时间的做法是,在ICMP报文的Data区域写入4个字节的时间戳。在收到应答报文时,取出这个时间戳与当前的时间对比即可。

};

(3)ICMP响应报文结构体:

//3.ICMP回答报文结构体

structPingReply

USHORTm_usSeq;//ICMP包的序列号2B

DWORDm_dwRoundTripTime;//时间差4B(word是2字节)

DWORDm_dwBytes;//数据所占字节数4B

DWORDm_dwTTL;//TTL生存时间4B

};

(4)Ping类及相关变量的定义:

classCPing

//公共变量

public:

CPing();//构造函数

~CPing();//析构函数

BOOLPing(DWORDdwDestIP,PingReply*pPingReply=NULL,DWORDdwTimeout=2000);

BOOLPing(char*szDestIP,PingReply*pPingReply=NULL,DWORDdwTimeout=2000);

//私有变量

private:

BOOLPingCore(DWORDdwDestIP,PingReply*pPingReply,DWORDdwTimeout);

USHORTCalCheckSum(USHORT*pBuffer,intnSize);//计算检验和

ULONGGetTickCountCalibrate();//计算毫秒级别的时间差

private:

SOCKETm_sockRaw;//需要监听的socket

WSAEVENTm_event;//网络事件对象

USHORTm_usCurrentProcID;//当前进程发出的报文

char*m_szICMPData;//ICMP(InternetControlMessageProtocol,网际控制报文协议)

BOOLm_bIsInitSucc;//初始化成功

private:

staticUSHORTs_usPacketSeq;//序列号++(16位=2字节)

};

(三)ping.cpp文件

#include"ping.h"

#includeiostream

USHORTCPing::s_usPacketSeq=0;

(1)char*m_szICMPData;BOOLm_bIsInitSucc;

//::表示类作用域。为避免不同的类有名称相同的成员而采用作用域的方式进行区分。

CPing::CPing():m_szICMPData(NULL),m_bIsInitSucc(FALSE)

WSADATAWSAData;

//WSAStartup(MAKEWORD(2,2),WSAData);

if(WSAStartup(MAKEWORD(1,1),WSAData)!=0)

printf("WSAStartup()failed:%d\n",GetLastError());/*如果初始化不成功则报错,GetLastError()返回发生的错误信息*/

return;

m_event=WSACreateEvent();//创建一个网络事件对象(HANDLEm_event)。//返回一个手工重置的事件对象句柄(HANDLEhEventObject)

m_usCurrentProcID=(USHORT)GetCurrentProcessId();//当前进程ID

/*ICMP必须使用原始套接字进行设计,要手动设置IP的头部和ICMP的头部并行校验*/

m_sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,0);//创建一个监听的socket(SOCKETm_sockRaw)//当IP报头中的协议字段值为1时,就说明这是一个ICMP报文。

if(m_sockRaw==INVALID_SOCKET)//无效套接字

std::cerr"WSASocket()failed:"WSAGetLastError()std::endl;//10013以一种访问权限不允许的方式做了一个访问套接字的尝试。

else//是ICMP报文,令初始化成功,为ICMP数据分配内存

WSAEventSelect(m_sockRaw,m_event,FD_READ);//调用WSAEventSelect将监听的socket(m_sockRaw)与该事件(m_event)进行关联。WSAEventSelect(套接字,网络事件对象,需要关注的事件

温馨提示

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

评论

0/150

提交评论