粗略实现Ping程序

本文介绍了如何从零开始实现一个简单的Ping程序,主要涉及到TCP/IP中的ICMP协议。通过解析主机地址,建立原始套接字,构建并发送ICMP数据报,以及接收和解析回应,来实现网络连通性的检测。程序采用C语言编写,不依赖第三方库。
摘要由CSDN通过智能技术生成

最近一直在看《TCP/IP详解》这本书,也许因为我不是计算机专业的缘故,总感觉看了跟没看一样,想着写写博客,能加深印象,结果简直是尴尬。所以想着不如自己动手来实现一个Ping程序,当是学习学习吧,几年以前用Boost带的asio库实现过一个,此次不依赖任何第三方库,实现一个最基本的Ping程序。

Ping程序原理

要实现ping程序,当然要知道他的原理,ping的原理其实很简单,几乎每个系统都实现了icmp服务器,当有icmp请求到来的时候,目的端就会做出相应的回应,ping程序正是利用了这一点。通过向目的端发送回显请求报文,观察目的端是否回应请求,从而判断网络是否连通。目的端会将源端发送过来的数据包再重新发回给源端。

Ping程序演示

系统自带的ping程序演示如图所示:
ping程序演示

数据报格式定义

该程序中涉及的数据报包括IP和ICMP两种数据报,各种数据报的定义如下,在定义数据报的时候必须准确,否则目的主机会丢弃数据报,而不会给出相应的应答。

ICMP报头定义

ICMP报文格式如下图所示:
ICMP报头
ICMP源端使用的类型是0x08,表示回显请求,代码是0,ICMP目的端使用的类型是0x00,表示回显应答,代码是0。类型及代码的意义如下图所示,检验和的计算方法网络上有很,请自行查询。
ICMP代码及类型
详细说明请参见:
ICMP:报文控制协议

ICMP报头的定义如下所示:
ICMP报头定义
其中,compute_checksum函数,用于计算ICMP报的校验和,计算方式如下:

compute_checksum(void)

构造函数用于在数据返回时,从目的端返回的数据缓冲区中读取出对应的ICMP报头。如下所示:

ICMP结构转换

IP报头定义

IP报文格式如下图所示:
IP报头格式
其中的数据部分就是我们的ICMP数据报头及数据部分。详细说明请参见
IP:网际协议

其C语言定义如下:
ip报头定义
该结构的构造函数如下所示,该构造函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值