c++builder ping_C++实现ping功能

本文介绍了如何使用C++Builder实现ping功能,通过创建SOCK_RAW套接字,发送和接收ICMP请求应答报文,计算往返时间。详细讲解了IP和ICMP头部结构,并提供了Ping程序的代码实现,包括`ping.h`和`ping.cpp`的类和方法,以及`main.cpp`的使用示例。
摘要由CSDN通过智能技术生成

今天接到需求要实现ping的功能,然后网上查了一些资料,对网络编程的一些函数熟悉了一下,虽然还有一些细节不清楚,但是慢慢积累。

要实现这样的功能:

基础知识

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个字节的时间戳。

在收到应答报文时,取出这个时间戳与当前的时间对比即可。

Ping程序实现步骤

创建类型为SOCK_RAW的一个套接字,同时设定协议IPPROTO_ICMP。

创建并初始化ICMP头。

调用sendto或WSASendto,将ICMP请求发给远程主机。

调用recvfrom或WSARecvfrom,以接收任何ICMP响应。

ping.h

#pragma once

//在默认windows.h会包含winsock.h,当你包含winsock2.h就会冲突,因此在包含windows.h前需要定义一个宏,#define WIN32_LEAN_AND_MEAN ;去除winsock.h//要么将#include 放在#include前面或者直接去掉#include

#include

#pragma comment(lib, "WS2_32") //链接到WS2_32.lib

#define DEF_PACKET_SIZE 32

#define ECHO_REQUEST 8

#define ECHO_REPLY 0

structIPHeader

{

BYTE m_byVerHLen;//4位版本+4位首部长度

BYTE m_byTOS; //服务类型

USHORT m_usTotalLen; //总长度

USHORT m_usID; //标识

USHORT m_usFlagFragOffset; //3位标志+13位片偏移

BYTE m_byTTL; //TTL

BYTE m_byProtocol; //协议

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值