用MFC创建一个ping的小程序
过程如下:
①设计界面如下:
主要控件有:列表控件,ip控件,按钮,静态文本
②为相应的控件添加变量
③根据过程,添加相应的源代码
Ping程序实现步骤
创建类型为SOCK_RAW的一个套接字,同时设定协议IPPROTO_ICMP。
创建并初始化ICMP头。
调用sendto或WSASendto,将ICMP请求发给远程主机。
调用recvfrom或WSARecvfrom,以接收任何ICMP响应。
④相应代码展示:
⑦参考博文链接:
http://blog.****.net/ivy8966/article/details/54612601?locationNum=6&fps=1
⑧转载部分博文:
ping的过程是向目的IP发送一个type=8的ICMP响应请求报文,目标主机收到这个报文之后,会向源IP(发送方,我)回复一个type=0的ICMP响应应答报文。
那上面的字节、往访时间、TTL之类的信息又是从哪来的呢?这取决于IP和ICMP的头部。
IP头部:
头部内容有点多,我们关心的只有以下几个:
IHL:首部长度。因为IP的头部不是定长的,所以需要这个信息进行IP包的解析,从而找到Data字段的起始点。
另外注意这个IHL是以4个字节为单位的,所以首部实际长度是IHL*4字节。
Time to Live:生存时间,这个就是TTL了。
Data:这部分是IP包的数据,也就是ICMP的报文内容。
ICMP响应请求/应答报文头部:
Type:类型,type=8表示响应请求报文,type=0表示响应应答报文。
Code:代码,与type组合,表示具体的信息,参考这里。
Checksum:检验和,这个是整个ICMP报文的检验和,包括Type、Code、...、Data。
Identifier:标识符,这个一般填入本进程的标识符。
Sequence Number:序号
Data:数据部分
上面是标准的ICMP报文,一般而言,统计ping的往返时间的做法是,在ICMP报文的Data区域写入4个字节的时间戳。
在收到应答报文时,取出这个时间戳与当前的时间对比即可。