ping 源码分析10.4.1 ping简介Ping是网络中应用非常广泛的一个软件,它是基于ICMP协议的。下面首先对ICMP协议做一简单介绍。ICMP是IP层的一个协议,它是用来探测主机、路由维护、路由选择和流量控制的。ICMP报文的最终报宿不是报宿计算机上的一个用户进程,而是那个计算机上的IP层软件。也就是说,当一个带有错误信息的ICMP报文到达时,IP软件模块就处理本身问题,而不把这个ICMP报文传送给应用程序。ICMP报文类型有:回送(ECHO)回答(0);报宿不可到达(3);报源断开(4);重定向(改变路由)(5);回送(ECHO)请求(8);数据报超时(11);数据报参数问题(12);时间印迹请求(13);时间印迹回答(14);信息请求(15);信息回答(16);地址掩码请求(17);地址掩码回答(18)。虽然每种报文都有不同的格式,但它们开始都有下面三段:一个8位整数报文TYPE(类型)段;一个8位CODE(代码码)段,提供更多的报文类型信息;一个16 位CHECKSUM(校验和)段;此外,报告差错的ICMP 报文还包含产生问题数据报的网际报头及前64 位数据。一个ICMP回送请求与回送回答报文的格式如表10.17 所示。表10.17 ICMP回送请求与回送回答报文格式类型CODE 校验和[CHECKSUM]标识符序列号《嵌入式Linux应用程序开发详解》——第10章、嵌入式Linux网络编程数据10.4.2 ping源码分析下面的ping.c 源码是在busybox 里实现的源码。在这个完整的ping.c 代码中有较多选项的部分代码,因此,这里先分析除去选项部分代码的函数实现部分流程,接下来再给出完整的ping代码分析。这样,读者就可以看到一个完整协议实现应该考虑到的各个部分。1.Ping 代码主体流程Ping.c主体流程图如下图10.8 所示。另外,由于ping是IP层的协议,因此在建立socket时需要使用SOCK_RAW 选项。在循环等待回应信息处,用户可以指定“-f”洪泛选项,这时就会使用select函数来指定在一定的时间内进行回应。2.主要选项说明Ping函数主要有以下几个选项:d:调试选项(F_SO_DEBUG)f:洪泛选项(F_FLOOD)i:等待选项(F_INTERVAL)r:路由选项(F_RROUTE)l:广播选项(MULTICAST_NOLOOP)对于这些选项,尤其是路由选项、广播选项和洪泛选项都会有不同的实现代码。另外,ping 函数可以接受用户使用的SIGINT 和SIGALARM 信号来结束程序,它们分别指向了不同的结束代码,请读者阅读下面相关代码。图10.8 ping主体流程图3.源代码及注释(1)...