自得怡乐 發表於 2024-1-12 00:00:00

Linux编程之PING实现

<p>
        PING(Packet InterNet Groper)中文名为因特网包探索器,是用来查看网络上另一个主机系统的网络连接是否正常的一个工具。ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把回复报文传回给发送者,这有点象潜水艇声纳系统中使用的发声装置。所以,我们想知道我这台主机能不能和另一台进行通信,我们首先需要确认的是我们两台主机间的网络是不是通的,也就是我说的话能不能传到你那里,这是双方进行通信的前提。在Linux下使用指令ping的方法和现象如下:</p>
<p>
        <img title="Linux编程之PING实现" alt="Linux编程之PING实现" src="https://zhuji.jb51.net/uploads/img/202305/321dd57e8a9b30b12c074792d43308ca.jpg"></p>
<p>
        PING的实现看起来并不复杂,我想自己写代码实现这个功能,需要些什么知识储备?我简单罗列了一下:</p>
<p>
        ·ICMP协议的理解</p>
<p>
        ·RAW套接字</p>
<p>
        ·网络封包和解包技能</p>
<p>
        搭建这么一个ping程序的步骤如下:</p>
<p>
        1、ICMP包的封装和解封</p>
<p>
        2、创建一个线程用于ICMP包的发送</p>
<p>
        3、创建一个线程用于ICMP包的接收</p>
<p>
        4、原始套接字编程</p>
<p>
        PING的流程如下:</p>
<p>
        <img title="Linux编程之PING实现" alt="Linux编程之PING实现" src="https://zhuji.jb51.net/uploads/img/202305/2b4c8c7ce0552cbbfff8b585870a5ecd.jpg"></p>
<p>
        <strong>一、ICMP包的封装和解封</strong></p>
<p>
        (1) ICMP协议理解要进行PING的开发,我们首先需要知道PING的实现是基于ICMP协议来开发的。要进行ICMP包的封装和解封,我们首先需要理解ICMP协议。ICMP位于网络层,允许主机或者路由器报告差错情况和提供有关异常情况的报告。ICMP报文是封装在IP数据报中,作为其中的数据部分。ICMP报文作为IP层数据报的数据,加上数据报头,组成IP数据报发送出去。ICMP报文格式如下:</p>
<p>
        <img title="Linux编程之PING实现" alt="Linux编程之PING实现" src="https://zhuji.jb51.net/uploads/img/202305/d628d7c63b8a9c6eff8fd605ca757e36.jpg"></p>
<p>
        ICMP报文的种类有两种,即ICMP差错报告报文和ICMP询问报文。PING程序使用的ICMP报文种类为ICMP询问报文。注意一下上面说到的ICMP报文格式中的“类型”字段,我们在组包的时候可以向该字段填写不同的值来标定该ICMP报文的类型。下面列出的是几种常用的ICMP报文类型。</p>
<p>
        <img title="Linux编程之PING实现" alt="Linux编程之PING实现" src="https://zhuji.jb51.net/uploads/img/202305/0a87dfd32ca77cedfceab56dedb94477.jpg"></p>
<p>
        我们的PING程序需要用到的ICMP的类型是回送请求(8)。<br>
        因为ICMP报文的具体格式会因为ICMP报文的类型而各不相同,我们ping包的格式是这样的:</p>
<p>
        <img title="Linux编程之PING实现" alt="Linux编程之PING实现" src="https://zhuji.jb51.net/uploads/img/202305/49258b869ff923df3d81f2e48dfedc09.jpg"></p>
<p>
        (2) ICMP包的组装</p>
<p>
        对照上面的ping包格式,我们封装ping包的代码可以这么写:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_120072">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java keyword">void</code> <code class="java plain">icmp_pack(struct icmp* icmphdr, </code><code class="java keyword">int</code> <code class="java plain">seq, </code><code class="java keyword">int</code> <code class="java plain">length)</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">{</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">int</code> <code class="java plain">i = </code><code class="java value">0</code><code class="java plain">;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                         </div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">icmphdr-&gt;icmp_type = ICMP_ECHO; </code><code class="java comments">//类型填回送请求</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">icmphdr-&gt;icmp_code = </code><code class="java value">0</code><code class="java plain">; </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">icmphdr-&gt;icmp_cksum = </code><code class="java value">0</code><code class="java plain">; </code><code class="java comments">//注意,这里先填写0,很重要!</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">icmphdr-&gt;icmp_seq = seq; </code><code class="java comments">//这里的序列号我们填1,2,3,4....</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">icmphdr-&gt;icmp_id = pid &amp; </code><code class="java value">0xffff</code><code class="java plain">; </code><code class="java comments">//我们使用pid作为icmp_id,icmp_id只是2字节,而pid有4字节</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="java spaces"> </code><code class="java keyword">for</code><code class="java plain">(i=</code><code class="java value">0</code><code class="java plain">;i&lt;length;i++)</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">{</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">icmphdr-&gt;icmp_data = i; </code><code class="java comments">//填充数据段,使ICMP报文大于64B</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">}</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                         </div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">icmphdr-&gt;icmp_cksum = cal_chksum((unsigned </code><code class="java keyword">short</code><code class="java plain">*)icmphdr, length); </code><code class="java comments">//校验和计算</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="java plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        这里再三提醒一下,<span>icmp_cksum 必须先填写为0</span>再执行校验和算法计算,否则ping时对方主机会因为校验和计算错误而丢弃请求包,导致ping的失败。我一个同事曾经就因为这么一个错误而排查许久,血的教训请铭记。</p>
<p>
        这里简单介绍一下checksum(校验和)。</p>
<p>
        计算机网络通信时,为了检验在数据传输过程中数据是否发生了错误,通常在传输数据的时候连同校验和一块传输,当接收端接受数据时候会从新计算校验和,如果与原校验和不同就视为出错,丢弃该数据包,并返回icmp报文。</p>
<p>
        <strong>算法基本思路:</strong></p>
<p>
        IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,采用的都是将数据流视为16位整数流进行重复叠加计算。为了计算检验和,首先把检验和字段置为0。然后,对有效数据范围内中每个16位进行二进制反码求和,结果存在检验和字段中,如果数据长度为奇数则补一字节0。当收到数据后,同样对有效数据范围中每个16位数进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全0或全1(具体看实现了,本质一样) 。如果结果不是全0或全1,那么表示数据错误。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_479731">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java comments">/*校验和算法*/</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">unsigned </code><code class="java keyword">short</code> <code class="java plain">cal_chksum(unsigned </code><code class="java keyword">short</code> <code class="java plain">*addr,</code><code class="java keyword">int</code> <code class="java plain">len)</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java plain">{  </code><code class="java keyword">int</code> <code class="java plain">nleft=len;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java spaces">  </code><code class="java keyword">int</code> <code class="java plain">sum=</code><code class="java value">0</code><code class="java plain">;</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">unsigned </code><code class="java keyword">short</code> <code class="java plain">*w=addr;</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">unsigned </code><code class="java keyword">short</code> <code class="java plain">answer=</code><code class="java value">0</code><code class="java plain">;</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                         </div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="java spaces">  </code><code class="java comments">/*把ICMP报头二进制数据以2字节为单位累加起来*/</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="java spaces">  </code><code class="java keyword">while</code><code class="java plain">(nleft&gt;</code><code class="java value">1</code><code class="java plain">)</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">{  </code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="java spaces">   </code><code class="java plain">sum+=*w++;</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="java spaces">   </code><code class="java plain">nleft-=</code><code class="java value">2</code><code class="java plain">;</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">}</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="java spaces">  </code><code class="java comments">/*若ICMP报头为奇数个字节,会剩下最后一字节。把最后一个字节视为一个2字节数据的高字节,这个2字节数据的低字节为0,继续累加*/</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="java spaces">  </code><code class="java keyword">if</code><code class="java plain">( nleft==</code><code class="java value">1</code><code class="java plain">)</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">{  </code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="java spaces">   </code><code class="java plain">*(unsigned </code><code class="java keyword">char</code> <code class="java plain">*)(&amp;answer)=*(unsigned </code><code class="java keyword">char</code> <code class="java plain">*)w;</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="java spaces">   </code><code class="java plain">sum+=answer;</code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">}</code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">sum=(sum&gt;&gt;</code><code class="java value">16</code><code class="java plain">)+(sum&amp;</code><code class="java value">0xffff</code><code class="java plain">);</code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">sum+=(sum&gt;&gt;</code><code class="java value">16</code><code class="java plain">);</code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">answer=~sum;</code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="java spaces">  </code><code class="java keyword">return</code> <code class="java plain">answer;</code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="java plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        (3) ICMP包的解包</p>
<p>
        知道怎么封装包,那解包就也不难了,注意的是,收到一个ICMP包,我们不要就认为这个包就是我们发出去的ICMP回送回答包,我们需要加一层代码来判断该ICMP报文的id和seq字段是否符合我们发送的ICMP报文的设置,来验证ICMP回复包的正确性。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_555168">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                        <div class="line number25 index24 alt2">
                                                                25</div>
                                                        <div class="line number26 index25 alt1">
                                                                26</div>
                                                        <div class="line number27 index26 alt2">
                                                                27</div>
                                                        <div class="line number28 index27 alt1">
                                                                28</div>
                                                        <div class="line number29 index28 alt2">
                                                                29</div>
                                                        <div class="line number30 index29 alt1">
                                                                30</div>
                                                        <div class="line number31 index30 alt2">
                                                                31</div>
                                                        <div class="line number32 index31 alt1">
                                                                32</div>
                                                        <div class="line number33 index32 alt2">
                                                                33</div>
                                                        <div class="line number34 index33 alt1">
                                                                34</div>
                                                        <div class="line number35 index34 alt2">
                                                                35</div>
                                                        <div class="line number36 index35 alt1">
                                                                36</div>
                                                        <div class="line number37 index36 alt2">
                                                                37</div>
                                                        <div class="line number38 index37 alt1">
                                                                38</div>
                                                        <div class="line number39 index38 alt2">
                                                                39</div>
                                                        <div class="line number40 index39 alt1">
                                                                40</div>
                                                        <div class="line number41 index40 alt2">
                                                                41</div>
                                                        <div class="line number42 index41 alt1">
                                                                42</div>
                                                        <div class="line number43 index42 alt2">
                                                                43</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java keyword">int</code> <code class="java plain">icmp_unpack(</code><code class="java keyword">char</code><code class="java plain">* buf, </code><code class="java keyword">int</code> <code class="java plain">len)</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">{</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">int</code> <code class="java plain">iphdr_len;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">struct timeval begin_time, recv_time, offset_time;</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">int</code> <code class="java plain">rtt; </code><code class="java comments">//round trip time</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                         </div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">struct ip* ip_hdr = (struct ip *)buf;</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">iphdr_len = ip_hdr-&gt;ip_hl*</code><code class="java value">4</code><code class="java plain">;</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">struct icmp* icmp = (struct icmp*)(buf+iphdr_len); </code><code class="java comments">//使指针跳过IP头指向ICMP头</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">len-=iphdr_len; </code><code class="java comments">//icmp包长度</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">if</code><code class="java plain">(len &lt; </code><code class="java value">8</code><code class="java plain">) </code><code class="java comments">//判断长度是否为ICMP包长度</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">{</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">fprintf(stderr, </code><code class="java string">"Invalid icmp packet.Its length is less than 8\n"</code><code class="java plain">);</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="java spaces">  </code><code class="java keyword">return</code> <code class="java plain">-</code><code class="java value">1</code><code class="java plain">;</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">}</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                         </div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="java spaces"> </code><code class="java comments">//判断该包是ICMP回送回答包且该包是我们发出去的</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="java spaces"> </code><code class="java keyword">if</code><code class="java plain">((icmp-&gt;icmp_type == ICMP_ECHOREPLY) &amp;&amp; (icmp-&gt;icmp_id == pid)) </code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">{</code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="java spaces">  </code><code class="java keyword">if</code><code class="java plain">((icmp-&gt;icmp_seq &lt; </code><code class="java value">0</code><code class="java plain">) || (icmp-&gt;icmp_seq &gt; PACKET_SEND_MAX_NUM))</code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">{</code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="java spaces">   </code><code class="java plain">fprintf(stderr, </code><code class="java string">"icmp packet seq is out of range!\n"</code><code class="java plain">);</code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="java spaces">   </code><code class="java keyword">return</code> <code class="java plain">-</code><code class="java value">1</code><code class="java plain">;</code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">}</code>
</div>
                                                                <div class="line number25 index24 alt2">
                                                                         </div>
                                                                <div class="line number26 index25 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">ping_packet.flag = </code><code class="java value">0</code><code class="java plain">;</code>
</div>
                                                                <div class="line number27 index26 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">begin_time = ping_packet.begin_time; </code><code class="java comments">//去除该包的发出时间</code>
</div>
                                                                <div class="line number28 index27 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">gettimeofday(&amp;recv_time, NULL);</code>
</div>
                                                                <div class="line number29 index28 alt2">
                                                                         </div>
                                                                <div class="line number30 index29 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">offset_time = cal_time_offset(begin_time, recv_time);</code>
</div>
                                                                <div class="line number31 index30 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">rtt = offset_time.tv_sec*</code><code class="java value">1000</code> <code class="java plain">+ offset_time.tv_usec/</code><code class="java value">1000</code><code class="java plain">; </code><code class="java comments">//毫秒为单位</code>
</div>
                                                                <div class="line number32 index31 alt1">
                                                                         </div>
                                                                <div class="line number33 index32 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">printf(</code><code class="java string">"%d byte from %s: icmp_seq=%u ttl=%d rtt=%d ms\n"</code><code class="java plain">,</code>
</div>
                                                                <div class="line number34 index33 alt1">
                                                                        <code class="java spaces">   </code><code class="java plain">len, inet_ntoa(ip_hdr-&gt;ip_src), icmp-&gt;icmp_seq, ip_hdr-&gt;ip_ttl, rtt);  </code>
</div>
                                                                <div class="line number35 index34 alt2">
                                                                         </div>
                                                                <div class="line number36 index35 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">}</code>
</div>
                                                                <div class="line number37 index36 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">else</code>
</div>
                                                                <div class="line number38 index37 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">{</code>
</div>
                                                                <div class="line number39 index38 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">fprintf(stderr, </code><code class="java string">"Invalid ICMP packet! Its id is not matched!\n"</code><code class="java plain">);</code>
</div>
                                                                <div class="line number40 index39 alt1">
                                                                        <code class="java spaces">  </code><code class="java keyword">return</code> <code class="java plain">-</code><code class="java value">1</code><code class="java plain">;</code>
</div>
                                                                <div class="line number41 index40 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">}</code>
</div>
                                                                <div class="line number42 index41 alt1">
                                                                        <code class="java spaces"> </code><code class="java keyword">return</code> <code class="java value">0</code><code class="java plain">;</code>
</div>
                                                                <div class="line number43 index42 alt2">
                                                                        <code class="java plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <strong>二、发包线程的搭建</strong></p>
<p>
        根据PING程序的框架,我们需要建立一个线程用于ping包的发送,我的想法是这样的:使用sendto进行发包,发包速率我们维持在1秒1发,我们需要用一个全局变量记录第一个ping包发出的时间,除此之外,我们还需要一个全局变量来记录我们发出的ping包到底有几个,这两个变量用于后来收到ping包回复后的数据计算。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_295053">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java keyword">void</code> <code class="java plain">ping_send()</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">{</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">char</code> <code class="java plain">send_buf[</code><code class="java value">128</code><code class="java plain">];</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">memset(send_buf, </code><code class="java value">0</code><code class="java plain">, sizeof(send_buf));</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">gettimeofday(&amp;start_time, NULL); </code><code class="java comments">//记录第一个ping包发出的时间</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="java spaces"> </code><code class="java keyword">while</code><code class="java plain">(alive)</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">{</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="java spaces">  </code><code class="java keyword">int</code> <code class="java plain">size = </code><code class="java value">0</code><code class="java plain">;</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">gettimeofday(&amp;(ping_packet.begin_time), NULL);</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">ping_packet.flag = </code><code class="java value">1</code><code class="java plain">; </code><code class="java comments">//将该标记为设置为该包已发送</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                         </div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">icmp_pack((struct icmp*)send_buf, send_count, </code><code class="java value">64</code><code class="java plain">); </code><code class="java comments">//封装icmp包</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">size = sendto(rawsock, send_buf, </code><code class="java value">64</code><code class="java plain">, </code><code class="java value">0</code><code class="java plain">, (struct sockaddr*)&amp;dest, sizeof(dest));</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">send_count++; </code><code class="java comments">//记录发出ping包的数量</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="java spaces">  </code><code class="java keyword">if</code><code class="java plain">(size &lt; </code><code class="java value">0</code><code class="java plain">)</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">{</code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="java spaces">   </code><code class="java plain">fprintf(stderr, </code><code class="java string">"send icmp packet fail!\n"</code><code class="java plain">);</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="java spaces">   </code><code class="java keyword">continue</code><code class="java plain">;</code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">}</code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                         </div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">sleep(</code><code class="java value">1</code><code class="java plain">);</code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">}</code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="java plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <strong>三、收包线程的搭建</strong><br>
        我们同样建立一个接收包的线程,这里我们采用select函数进行收包,并为select函数设置超时时间为200us,若发生超时,则进行下一个循环。同样地,我们也需要一个全局变量来记录成功接收到的ping回复包的数量。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_781487">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                        <div class="line number25 index24 alt2">
                                                                25</div>
                                                        <div class="line number26 index25 alt1">
                                                                26</div>
                                                        <div class="line number27 index26 alt2">
                                                                27</div>
                                                        <div class="line number28 index27 alt1">
                                                                28</div>
                                                        <div class="line number29 index28 alt2">
                                                                29</div>
                                                        <div class="line number30 index29 alt1">
                                                                30</div>
                                                        <div class="line number31 index30 alt2">
                                                                31</div>
                                                        <div class="line number32 index31 alt1">
                                                                32</div>
                                                        <div class="line number33 index32 alt2">
                                                                33</div>
                                                        <div class="line number34 index33 alt1">
                                                                34</div>
                                                        <div class="line number35 index34 alt2">
                                                                35</div>
                                                        <div class="line number36 index35 alt1">
                                                                36</div>
                                                        <div class="line number37 index36 alt2">
                                                                37</div>
                                                        <div class="line number38 index37 alt1">
                                                                38</div>
                                                        <div class="line number39 index38 alt2">
                                                                39</div>
                                                        <div class="line number40 index39 alt1">
                                                                40</div>
                                                        <div class="line number41 index40 alt2">
                                                                41</div>
                                                        <div class="line number42 index41 alt1">
                                                                42</div>
                                                        <div class="line number43 index42 alt2">
                                                                43</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java keyword">void</code> <code class="java plain">ping_recv()</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">{</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">struct timeval tv;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">tv.tv_usec = </code><code class="java value">200</code><code class="java plain">; </code><code class="java comments">//设置select函数的超时时间为200us</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">tv.tv_sec = </code><code class="java value">0</code><code class="java plain">;</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">fd_set read_fd;</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">char</code> <code class="java plain">recv_buf[</code><code class="java value">512</code><code class="java plain">];</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">memset(recv_buf, </code><code class="java value">0</code> <code class="java plain">,sizeof(recv_buf));</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="java spaces"> </code><code class="java keyword">while</code><code class="java plain">(alive)</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">{</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="java spaces">  </code><code class="java keyword">int</code> <code class="java plain">ret = </code><code class="java value">0</code><code class="java plain">;</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">FD_ZERO(&amp;read_fd);</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">FD_SET(rawsock, &amp;read_fd);</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">ret = select(rawsock+</code><code class="java value">1</code><code class="java plain">, &amp;read_fd, NULL, NULL, &amp;tv);</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="java spaces">  </code><code class="java keyword">switch</code><code class="java plain">(ret)</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="java spaces">  </code><code class="java plain">{</code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="java spaces">   </code><code class="java keyword">case</code> <code class="java plain">-</code><code class="java value">1</code><code class="java plain">:</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="java spaces">    </code><code class="java plain">fprintf(stderr,</code><code class="java string">"fail to select!\n"</code><code class="java plain">);</code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="java spaces">    </code><code class="java keyword">break</code><code class="java plain">;</code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="java spaces">   </code><code class="java keyword">case</code> <code class="java value">0</code><code class="java plain">:</code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="java spaces">    </code><code class="java keyword">break</code><code class="java plain">;</code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="java spaces">   </code><code class="java keyword">default</code><code class="java plain">:</code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="java spaces">    </code><code class="java plain">{</code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="java spaces">     </code><code class="java keyword">int</code> <code class="java plain">size = recv(rawsock, recv_buf, sizeof(recv_buf), </code><code class="java value">0</code><code class="java plain">);</code>
</div>
                                                                <div class="line number25 index24 alt2">
                                                                        <code class="java spaces">     </code><code class="java keyword">if</code><code class="java plain">(size &lt; </code><code class="java value">0</code><code class="java plain">)</code>
</div>
                                                                <div class="line number26 index25 alt1">
                                                                        <code class="java spaces">     </code><code class="java plain">{</code>
</div>
                                                                <div class="line number27 index26 alt2">
                                                                        <code class="java spaces">      </code><code class="java plain">fprintf(stderr,</code><code class="java string">"recv data fail!\n"</code><code class="java plain">);</code>
</div>
                                                                <div class="line number28 index27 alt1">
                                                                        <code class="java spaces">      </code><code class="java keyword">continue</code><code class="java plain">;</code>
</div>
                                                                <div class="line number29 index28 alt2">
                                                                        <code class="java spaces">     </code><code class="java plain">}</code>
</div>
                                                                <div class="line number30 index29 alt1">
                                                                         </div>
                                                                <div class="line number31 index30 alt2">
                                                                        <code class="java spaces">     </code><code class="java plain">ret = icmp_unpack(recv_buf, size); </code><code class="java comments">//对接收的包进行解封</code>
</div>
                                                                <div class="line number32 index31 alt1">
                                                                        <code class="java spaces">     </code><code class="java keyword">if</code><code class="java plain">(ret == -</code><code class="java value">1</code><code class="java plain">) </code><code class="java comments">//不是属于自己的icmp包,丢弃不处理</code>
</div>
                                                                <div class="line number33 index32 alt2">
                                                                        <code class="java spaces">     </code><code class="java plain">{</code>
</div>
                                                                <div class="line number34 index33 alt1">
                                                                        <code class="java spaces">      </code><code class="java keyword">continue</code><code class="java plain">;</code>
</div>
                                                                <div class="line number35 index34 alt2">
                                                                        <code class="java spaces">     </code><code class="java plain">}</code>
</div>
                                                                <div class="line number36 index35 alt1">
                                                                        <code class="java spaces">     </code><code class="java plain">recv_count++; </code><code class="java comments">//接收包计数</code>
</div>
                                                                <div class="line number37 index36 alt2">
                                                                        <code class="java spaces">    </code><code class="java plain">}</code>
</div>
                                                                <div class="line number38 index37 alt1">
                                                                        <code class="java spaces">    </code><code class="java keyword">break</code><code class="java plain">;</code>
</div>
                                                                <div class="line number39 index38 alt2">
                                                                        <code class="java spaces">  </code><code class="java plain">}</code>
</div>
                                                                <div class="line number40 index39 alt1">
                                                                         </div>
                                                                <div class="line number41 index40 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">}</code>
</div>
                                                                <div class="line number42 index41 alt1">
                                                                        <code class="java plain">}&lt;strong&gt;</code>
</div>
                                                                <div class="line number43 index42 alt2">
                                                                        <code class="java plain">&lt;/strong&gt;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
         </p>
<p>
        <strong>四、中断处理</strong></p>
<p>
        我们规定了一次ping发送的包的最大值为64个,若超出该数值就停止发送。作为PING的使用者,我们一般只会发送若干个包,若有这几个包顺利返回,我们就crtl+c中断ping。这里的代码主要是为中断信号写一个中断处理函数,将alive这个全局变量设置为0,进而使发送ping包的循环停止而结束程序。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterjava" id="highlighter_326880">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="java keyword">void</code> <code class="java plain">icmp_sigint(</code><code class="java keyword">int</code> <code class="java plain">signo)</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="java plain">{</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">alive = </code><code class="java value">0</code><code class="java plain">;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="java spaces"> </code><code class="java plain">gettimeofday(&amp;end_time, NULL);</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="java spaces"> </code><code class="java plain">time_interval = cal_time_offset(start_time, end_time);</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="java plain">}</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                         </div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="java plain">signal(SIGINT, icmp_sigint);</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <strong>五、总体实现</strong></p>
<p>
        各模块介绍完了,现在贴出完整代码。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_265674">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                        <div class="line number25 index24 alt2">
                                                                25</div>
                                                        <div class="line number26 index25 alt1">
                                                                26</div>
                                                        <div class="line number27 index26 alt2">
                                                                27</div>
                                                        <div class="line number28 index27 alt1">
                                                                28</div>
                                                        <div class="line number29 index28 alt2">
                                                                29</div>
                                                        <div class="line number30 index29 alt1">
                                                                30</div>
                                                        <div class="line number31 index30 alt2">
                                                                31</div>
                                                        <div class="line number32 index31 alt1">
                                                                32</div>
                                                        <div class="line number33 index32 alt2">
                                                                33</div>
                                                        <div class="line number34 index33 alt1">
                                                                34</div>
                                                        <div class="line number35 index34 alt2">
                                                                35</div>
                                                        <div class="line number36 index35 alt1">
                                                                36</div>
                                                        <div class="line number37 index36 alt2">
                                                                37</div>
                                                        <div class="line number38 index37 alt1">
                                                                38</div>
                                                        <div class="line number39 index38 alt2">
                                                                39</div>
                                                        <div class="line number40 index39 alt1">
                                                                40</div>
                                                        <div class="line number41 index40 alt2">
                                                                41</div>
                                                        <div class="line number42 index41 alt1">
                                                                42</div>
                                                        <div class="line number43 index42 alt2">
                                                                43</div>
                                                        <div class="line number44 index43 alt1">
                                                                44</div>
                                                        <div class="line number45 index44 alt2">
                                                                45</div>
                                                        <div class="line number46 index45 alt1">
                                                                46</div>
                                                        <div class="line number47 index46 alt2">
                                                                47</div>
                                                        <div class="line number48 index47 alt1">
                                                                48</div>
                                                        <div class="line number49 index48 alt2">
                                                                49</div>
                                                        <div class="line number50 index49 alt1">
                                                                50</div>
                                                        <div class="line number51 index50 alt2">
                                                                51</div>
                                                        <div class="line number52 index51 alt1">
                                                                52</div>
                                                        <div class="line number53 index52 alt2">
                                                                53</div>
                                                        <div class="line number54 index53 alt1">
                                                                54</div>
                                                        <div class="line number55 index54 alt2">
                                                                55</div>
                                                        <div class="line number56 index55 alt1">
                                                                56</div>
                                                        <div class="line number57 index56 alt2">
                                                                57</div>
                                                        <div class="line number58 index57 alt1">
                                                                58</div>
                                                        <div class="line number59 index58 alt2">
                                                                59</div>
                                                        <div class="line number60 index59 alt1">
                                                                60</div>
                                                        <div class="line number61 index60 alt2">
                                                                61</div>
                                                        <div class="line number62 index61 alt1">
                                                                62</div>
                                                        <div class="line number63 index62 alt2">
                                                                63</div>
                                                        <div class="line number64 index63 alt1">
                                                                64</div>
                                                        <div class="line number65 index64 alt2">
                                                                65</div>
                                                        <div class="line number66 index65 alt1">
                                                                66</div>
                                                        <div class="line number67 index66 alt2">
                                                                67</div>
                                                        <div class="line number68 index67 alt1">
                                                                68</div>
                                                        <div class="line number69 index68 alt2">
                                                                69</div>
                                                        <div class="line number70 index69 alt1">
                                                                70</div>
                                                        <div class="line number71 index70 alt2">
                                                                71</div>
                                                        <div class="line number72 index71 alt1">
                                                                72</div>
                                                        <div class="line number73 index72 alt2">
                                                                73</div>
                                                        <div class="line number74 index73 alt1">
                                                                74</div>
                                                        <div class="line number75 index74 alt2">
                                                                75</div>
                                                        <div class="line number76 index75 alt1">
                                                                76</div>
                                                        <div class="line number77 index76 alt2">
                                                                77</div>
                                                        <div class="line number78 index77 alt1">
                                                                78</div>
                                                        <div class="line number79 index78 alt2">
                                                                79</div>
                                                        <div class="line number80 index79 alt1">
                                                                80</div>
                                                        <div class="line number81 index80 alt2">
                                                                81</div>
                                                        <div class="line number82 index81 alt1">
                                                                82</div>
                                                        <div class="line number83 index82 alt2">
                                                                83</div>
                                                        <div class="line number84 index83 alt1">
                                                                84</div>
                                                        <div class="line number85 index84 alt2">
                                                                85</div>
                                                        <div class="line number86 index85 alt1">
                                                                86</div>
                                                        <div class="line number87 index86 alt2">
                                                                87</div>
                                                        <div class="line number88 index87 alt1">
                                                                88</div>
                                                        <div class="line number89 index88 alt2">
                                                                89</div>
                                                        <div class="line number90 index89 alt1">
                                                                90</div>
                                                        <div class="line number91 index90 alt2">
                                                                91</div>
                                                        <div class="line number92 index91 alt1">
                                                                92</div>
                                                        <div class="line number93 index92 alt2">
                                                                93</div>
                                                        <div class="line number94 index93 alt1">
                                                                94</div>
                                                        <div class="line number95 index94 alt2">
                                                                95</div>
                                                        <div class="line number96 index95 alt1">
                                                                96</div>
                                                        <div class="line number97 index96 alt2">
                                                                97</div>
                                                        <div class="line number98 index97 alt1">
                                                                98</div>
                                                        <div class="line number99 index98 alt2">
                                                                99</div>
                                                        <div class="line number100 index99 alt1">
                                                                100</div>
                                                        <div class="line number101 index100 alt2">
                                                                101</div>
                                                        <div class="line number102 index101 alt1">
                                                                102</div>
                                                        <div class="line number103 index102 alt2">
                                                                103</div>
                                                        <div class="line number104 index103 alt1">
                                                                104</div>
                                                        <div class="line number105 index104 alt2">
                                                                105</div>
                                                        <div class="line number106 index105 alt1">
                                                                106</div>
                                                        <div class="line number107 index106 alt2">
                                                                107</div>
                                                        <div class="line number108 index107 alt1">
                                                                108</div>
                                                        <div class="line number109 index108 alt2">
                                                                109</div>
                                                        <div class="line number110 index109 alt1">
                                                                110</div>
                                                        <div class="line number111 index110 alt2">
                                                                111</div>
                                                        <div class="line number112 index111 alt1">
                                                                112</div>
                                                        <div class="line number113 index112 alt2">
                                                                113</div>
                                                        <div class="line number114 index113 alt1">
                                                                114</div>
                                                        <div class="line number115 index114 alt2">
                                                                115</div>
                                                        <div class="line number116 index115 alt1">
                                                                116</div>
                                                        <div class="line number117 index116 alt2">
                                                                117</div>
                                                        <div class="line number118 index117 alt1">
                                                                118</div>
                                                        <div class="line number119 index118 alt2">
                                                                119</div>
                                                        <div class="line number120 index119 alt1">
                                                                120</div>
                                                        <div class="line number121 index120 alt2">
                                                                121</div>
                                                        <div class="line number122 index121 alt1">
                                                                122</div>
                                                        <div class="line number123 index122 alt2">
                                                                123</div>
                                                        <div class="line number124 index123 alt1">
                                                                124</div>
                                                        <div class="line number125 index124 alt2">
                                                                125</div>
                                                        <div class="line number126 index125 alt1">
                                                                126</div>
                                                        <div class="line number127 index126 alt2">
                                                                127</div>
                                                        <div class="line number128 index127 alt1">
                                                                128</div>
                                                        <div class="line number129 index128 alt2">
                                                                129</div>
                                                        <div class="line number130 index129 alt1">
                                                                130</div>
                                                        <div class="line number131 index130 alt2">
                                                                131</div>
                                                        <div class="line number132 index131 alt1">
                                                                132</div>
                                                        <div class="line number133 index132 alt2">
                                                                133</div>
                                                        <div class="line number134 index133 alt1">
                                                                134</div>
                                                        <div class="line number135 index134 alt2">
                                                                135</div>
                                                        <div class="line number136 index135 alt1">
                                                                136</div>
                                                        <div class="line number137 index136 alt2">
                                                                137</div>
                                                        <div class="line number138 index137 alt1">
                                                                138</div>
                                                        <div class="line number139 index138 alt2">
                                                                139</div>
                                                        <div class="line number140 index139 alt1">
                                                                140</div>
                                                        <div class="line number141 index140 alt2">
                                                                141</div>
                                                        <div class="line number142 index141 alt1">
                                                                142</div>
                                                        <div class="line number143 index142 alt2">
                                                                143</div>
                                                        <div class="line number144 index143 alt1">
                                                                144</div>
                                                        <div class="line number145 index144 alt2">
                                                                145</div>
                                                        <div class="line number146 index145 alt1">
                                                                146</div>
                                                        <div class="line number147 index146 alt2">
                                                                147</div>
                                                        <div class="line number148 index147 alt1">
                                                                148</div>
                                                        <div class="line number149 index148 alt2">
                                                                149</div>
                                                        <div class="line number150 index149 alt1">
                                                                150</div>
                                                        <div class="line number151 index150 alt2">
                                                                151</div>
                                                        <div class="line number152 index151 alt1">
                                                                152</div>
                                                        <div class="line number153 index152 alt2">
                                                                153</div>
                                                        <div class="line number154 index153 alt1">
                                                                154</div>
                                                        <div class="line number155 index154 alt2">
                                                                155</div>
                                                        <div class="line number156 index155 alt1">
                                                                156</div>
                                                        <div class="line number157 index156 alt2">
                                                                157</div>
                                                        <div class="line number158 index157 alt1">
                                                                158</div>
                                                        <div class="line number159 index158 alt2">
                                                                159</div>
                                                        <div class="line number160 index159 alt1">
                                                                160</div>
                                                        <div class="line number161 index160 alt2">
                                                                161</div>
                                                        <div class="line number162 index161 alt1">
                                                                162</div>
                                                        <div class="line number163 index162 alt2">
                                                                163</div>
                                                        <div class="line number164 index163 alt1">
                                                                164</div>
                                                        <div class="line number165 index164 alt2">
                                                                165</div>
                                                        <div class="line number166 index165 alt1">
                                                                166</div>
                                                        <div class="line number167 index166 alt2">
                                                                167</div>
                                                        <div class="line number168 index167 alt1">
                                                                168</div>
                                                        <div class="line number169 index168 alt2">
                                                                169</div>
                                                        <div class="line number170 index169 alt1">
                                                                170</div>
                                                        <div class="line number171 index170 alt2">
                                                                171</div>
                                                        <div class="line number172 index171 alt1">
                                                                172</div>
                                                        <div class="line number173 index172 alt2">
                                                                173</div>
                                                        <div class="line number174 index173 alt1">
                                                                174</div>
                                                        <div class="line number175 index174 alt2">
                                                                175</div>
                                                        <div class="line number176 index175 alt1">
                                                                176</div>
                                                        <div class="line number177 index176 alt2">
                                                                177</div>
                                                        <div class="line number178 index177 alt1">
                                                                178</div>
                                                        <div class="line number179 index178 alt2">
                                                                179</div>
                                                        <div class="line number180 index179 alt1">
                                                                180</div>
                                                        <div class="line number181 index180 alt2">
                                                                181</div>
                                                        <div class="line number182 index181 alt1">
                                                                182</div>
                                                        <div class="line number183 index182 alt2">
                                                                183</div>
                                                        <div class="line number184 index183 alt1">
                                                                184</div>
                                                        <div class="line number185 index184 alt2">
                                                                185</div>
                                                        <div class="line number186 index185 alt1">
                                                                186</div>
                                                        <div class="line number187 index186 alt2">
                                                                187</div>
                                                        <div class="line number188 index187 alt1">
                                                                188</div>
                                                        <div class="line number189 index188 alt2">
                                                                189</div>
                                                        <div class="line number190 index189 alt1">
                                                                190</div>
                                                        <div class="line number191 index190 alt2">
                                                                191</div>
                                                        <div class="line number192 index191 alt1">
                                                                192</div>
                                                        <div class="line number193 index192 alt2">
                                                                193</div>
                                                        <div class="line number194 index193 alt1">
                                                                194</div>
                                                        <div class="line number195 index194 alt2">
                                                                195</div>
                                                        <div class="line number196 index195 alt1">
                                                                196</div>
                                                        <div class="line number197 index196 alt2">
                                                                197</div>
                                                        <div class="line number198 index197 alt1">
                                                                198</div>
                                                        <div class="line number199 index198 alt2">
                                                                199</div>
                                                        <div class="line number200 index199 alt1">
                                                                200</div>
                                                        <div class="line number201 index200 alt2">
                                                                201</div>
                                                        <div class="line number202 index201 alt1">
                                                                202</div>
                                                        <div class="line number203 index202 alt2">
                                                                203</div>
                                                        <div class="line number204 index203 alt1">
                                                                204</div>
                                                        <div class="line number205 index204 alt2">
                                                                205</div>
                                                        <div class="line number206 index205 alt1">
                                                                206</div>
                                                        <div class="line number207 index206 alt2">
                                                                207</div>
                                                        <div class="line number208 index207 alt1">
                                                                208</div>
                                                        <div class="line number209 index208 alt2">
                                                                209</div>
                                                        <div class="line number210 index209 alt1">
                                                                210</div>
                                                        <div class="line number211 index210 alt2">
                                                                211</div>
                                                        <div class="line number212 index211 alt1">
                                                                212</div>
                                                        <div class="line number213 index212 alt2">
                                                                213</div>
                                                        <div class="line number214 index213 alt1">
                                                                214</div>
                                                        <div class="line number215 index214 alt2">
                                                                215</div>
                                                        <div class="line number216 index215 alt1">
                                                                216</div>
                                                        <div class="line number217 index216 alt2">
                                                                217</div>
                                                        <div class="line number218 index217 alt1">
                                                                218</div>
                                                        <div class="line number219 index218 alt2">
                                                                219</div>
                                                        <div class="line number220 index219 alt1">
                                                                220</div>
                                                        <div class="line number221 index220 alt2">
                                                                221</div>
                                                        <div class="line number222 index221 alt1">
                                                                222</div>
                                                        <div class="line number223 index222 alt2">
                                                                223</div>
                                                        <div class="line number224 index223 alt1">
                                                                224</div>
                                                        <div class="line number225 index224 alt2">
                                                                225</div>
                                                        <div class="line number226 index225 alt1">
                                                                226</div>
                                                        <div class="line number227 index226 alt2">
                                                                227</div>
                                                        <div class="line number228 index227 alt1">
                                                                228</div>
                                                        <div class="line number229 index228 alt2">
                                                                229</div>
                                                        <div class="line number230 index229 alt1">
                                                                230</div>
                                                        <div class="line number231 index230 alt2">
                                                                231</div>
                                                        <div class="line number232 index231 alt1">
                                                                232</div>
                                                        <div class="line number233 index232 alt2">
                                                                233</div>
                                                        <div class="line number234 index233 alt1">
                                                                234</div>
                                                        <div class="line number235 index234 alt2">
                                                                235</div>
                                                        <div class="line number236 index235 alt1">
                                                                236</div>
                                                        <div class="line number237 index236 alt2">
                                                                237</div>
                                                        <div class="line number238 index237 alt1">
                                                                238</div>
                                                        <div class="line number239 index238 alt2">
                                                                239</div>
                                                        <div class="line number240 index239 alt1">
                                                                240</div>
                                                        <div class="line number241 index240 alt2">
                                                                241</div>
                                                        <div class="line number242 index241 alt1">
                                                                242</div>
                                                        <div class="line number243 index242 alt2">
                                                                243</div>
                                                        <div class="line number244 index243 alt1">
                                                                244</div>
                                                        <div class="line number245 index244 alt2">
                                                                245</div>
                                                        <div class="line number246 index245 alt1">
                                                                246</div>
                                                        <div class="line number247 index246 alt2">
                                                                247</div>
                                                        <div class="line number248 index247 alt1">
                                                                248</div>
                                                        <div class="line number249 index248 alt2">
                                                                249</div>
                                                        <div class="line number250 index249 alt1">
                                                                250</div>
                                                        <div class="line number251 index250 alt2">
                                                                251</div>
                                                        <div class="line number252 index251 alt1">
                                                                252</div>
                                                        <div class="line number253 index252 alt2">
                                                                253</div>
                                                        <div class="line number254 index253 alt1">
                                                                254</div>
                                                        <div class="line number255 index254 alt2">
                                                                255</div>
                                                        <div class="line number256 index255 alt1">
                                                                256</div>
                                                        <div class="line number257 index256 alt2">
                                                                257</div>
                                                        <div class="line number258 index257 alt1">
                                                                258</div>
                                                        <div class="line number259 index258 alt2">
                                                                259</div>
                                                        <div class="line number260 index259 alt1">
                                                                260</div>
                                                        <div class="line number261 index260 alt2">
                                                                261</div>
                                                        <div class="line number262 index261 alt1">
                                                                262</div>
                                                        <div class="line number263 index262 alt2">
                                                                263</div>
                                                        <div class="line number264 index263 alt1">
                                                                264</div>
                                                        <div class="line number265 index264 alt2">
                                                                265</div>
                                                        <div class="line number266 index265 alt1">
                                                                266</div>
                                                        <div class="line number267 index266 alt2">
                                                                267</div>
                                                        <div class="line number268 index267 alt1">
                                                                268</div>
                                                        <div class="line number269 index268 alt2">
                                                                269</div>
                                                        <div class="line number270 index269 alt1">
                                                                270</div>
                                                        <div class="line number271 index270 alt2">
                                                                271</div>
                                                        <div class="line number272 index271 alt1">
                                                                272</div>
                                                        <div class="line number273 index272 alt2">
                                                                273</div>
                                                        <div class="line number274 index273 alt1">
                                                                274</div>
                                                        <div class="line number275 index274 alt2">
                                                                275</div>
                                                        <div class="line number276 index275 alt1">
                                                                276</div>
                                                        <div class="line number277 index276 alt2">
                                                                277</div>
                                                        <div class="line number278 index277 alt1">
                                                                278</div>
                                                        <div class="line number279 index278 alt2">
                                                                279</div>
                                                        <div class="line number280 index279 alt1">
                                                                280</div>
                                                        <div class="line number281 index280 alt2">
                                                                281</div>
                                                        <div class="line number282 index281 alt1">
                                                                282</div>
                                                        <div class="line number283 index282 alt2">
                                                                283</div>
                                                        <div class="line number284 index283 alt1">
                                                                284</div>
                                                        <div class="line number285 index284 alt2">
                                                                285</div>
                                                        <div class="line number286 index285 alt1">
                                                                286</div>
                                                        <div class="line number287 index286 alt2">
                                                                287</div>
                                                        <div class="line number288 index287 alt1">
                                                                288</div>
                                                        <div class="line number289 index288 alt2">
                                                                289</div>
                                                        <div class="line number290 index289 alt1">
                                                                290</div>
                                                        <div class="line number291 index290 alt2">
                                                                291</div>
                                                        <div class="line number292 index291 alt1">
                                                                292</div>
                                                        <div class="line number293 index292 alt2">
                                                                293</div>
                                                        <div class="line number294 index293 alt1">
                                                                294</div>
                                                        <div class="line number295 index294 alt2">
                                                                295</div>
                                                        <div class="line number296 index295 alt1">
                                                                296</div>
                                                        <div class="line number297 index296 alt2">
                                                                297</div>
                                                        <div class="line number298 index297 alt1">
                                                                298</div>
                                                        <div class="line number299 index298 alt2">
                                                                299</div>
                                                        <div class="line number300 index299 alt1">
                                                                300</div>
                                                        <div class="line number301 index300 alt2">
                                                                301</div>
                                                        <div class="line number302 index301 alt1">
                                                                302</div>
                                                        <div class="line number303 index302 alt2">
                                                                303</div>
                                                        <div class="line number304 index303 alt1">
                                                                304</div>
                                                        <div class="line number305 index304 alt2">
                                                                305</div>
                                                        <div class="line number306 index305 alt1">
                                                                306</div>
                                                        <div class="line number307 index306 alt2">
                                                                307</div>
                                                        <div class="line number308 index307 alt1">
                                                                308</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;stdio.h&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;netinet/in.h&gt;</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;netinet/ip.h&gt;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;netinet/ip_icmp.h&gt;</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;unistd.h&gt;</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;signal.h&gt;</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;arpa/inet.h&gt;</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;errno.h&gt;</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;sys/time.h&gt;</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;string.h&gt;</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;netdb.h&gt;</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;pthread.h&gt;</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                         </div>
                                                                <div class="line number14 index13 alt1">
                                                                         </div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="cpp preprocessor">#define PACKET_SEND_MAX_NUM 64</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                         </div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="cpp keyword bold">typedef</code> <code class="cpp keyword bold">struct</code> <code class="cpp plain">ping_packet_status</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="cpp plain">{</code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">timeval begin_time;</code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">timeval end_time;</code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">flag; </code><code class="cpp comments">//发送标志,1为已发送</code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">seq;  </code><code class="cpp comments">//包的序列号</code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="cpp plain">}ping_packet_status;</code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                         </div>
                                                                <div class="line number25 index24 alt2">
                                                                         </div>
                                                                <div class="line number26 index25 alt1">
                                                                         </div>
                                                                <div class="line number27 index26 alt2">
                                                                        <code class="cpp plain">ping_packet_status ping_packet;</code>
</div>
                                                                <div class="line number28 index27 alt1">
                                                                         </div>
                                                                <div class="line number29 index28 alt2">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">alive;</code>
</div>
                                                                <div class="line number30 index29 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">rawsock;</code>
</div>
                                                                <div class="line number31 index30 alt2">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">send_count;</code>
</div>
                                                                <div class="line number32 index31 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">recv_count;</code>
</div>
                                                                <div class="line number33 index32 alt2">
                                                                        <code class="cpp plain">pid_t pid;</code>
</div>
                                                                <div class="line number34 index33 alt1">
                                                                        <code class="cpp keyword bold">struct</code> <code class="cpp plain">sockaddr_in dest;</code>
</div>
                                                                <div class="line number35 index34 alt2">
                                                                        <code class="cpp keyword bold">struct</code> <code class="cpp plain">timeval start_time;</code>
</div>
                                                                <div class="line number36 index35 alt1">
                                                                        <code class="cpp keyword bold">struct</code> <code class="cpp plain">timeval end_time;</code>
</div>
                                                                <div class="line number37 index36 alt2">
                                                                        <code class="cpp keyword bold">struct</code> <code class="cpp plain">timeval time_interval;</code>
</div>
                                                                <div class="line number38 index37 alt1">
                                                                         </div>
                                                                <div class="line number39 index38 alt2">
                                                                        <code class="cpp comments">/*校验和算法*/</code>
</div>
                                                                <div class="line number40 index39 alt1">
                                                                        <code class="cpp plain">unsigned </code><code class="cpp color1 bold">short</code> <code class="cpp plain">cal_chksum(unsigned </code><code class="cpp color1 bold">short</code> <code class="cpp plain">*addr,</code><code class="cpp color1 bold">int</code> <code class="cpp plain">len)</code>
</div>
                                                                <div class="line number41 index40 alt2">
                                                                        <code class="cpp plain">{  </code><code class="cpp color1 bold">int</code> <code class="cpp plain">nleft=len;</code>
</div>
                                                                <div class="line number42 index41 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">int</code> <code class="cpp plain">sum=0;</code>
</div>
                                                                <div class="line number43 index42 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">unsigned </code><code class="cpp color1 bold">short</code> <code class="cpp plain">*w=addr;</code>
</div>
                                                                <div class="line number44 index43 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">unsigned </code><code class="cpp color1 bold">short</code> <code class="cpp plain">answer=0;</code>
</div>
                                                                <div class="line number45 index44 alt2">
                                                                         </div>
                                                                <div class="line number46 index45 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp comments">/*把ICMP报头二进制数据以2字节为单位累加起来*/</code>
</div>
                                                                <div class="line number47 index46 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">while</code><code class="cpp plain">(nleft&gt;1)</code>
</div>
                                                                <div class="line number48 index47 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">{  </code>
</div>
                                                                <div class="line number49 index48 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">sum+=*w++;</code>
</div>
                                                                <div class="line number50 index49 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">nleft-=2;</code>
</div>
                                                                <div class="line number51 index50 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number52 index51 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp comments">/*若ICMP报头为奇数个字节,会剩下最后一字节。把最后一个字节视为一个2字节数据的高字节,这个2字节数据的低字节为0,继续累加*/</code>
</div>
                                                                <div class="line number53 index52 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">if</code><code class="cpp plain">( nleft==1)</code>
</div>
                                                                <div class="line number54 index53 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">{  </code>
</div>
                                                                <div class="line number55 index54 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">*(unsigned </code><code class="cpp color1 bold">char</code> <code class="cpp plain">*)(&amp;answer)=*(unsigned </code><code class="cpp color1 bold">char</code> <code class="cpp plain">*)w;</code>
</div>
                                                                <div class="line number56 index55 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">sum+=answer;</code>
</div>
                                                                <div class="line number57 index56 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number58 index57 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">sum=(sum&gt;&gt;16)+(sum&amp;0xffff);</code>
</div>
                                                                <div class="line number59 index58 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">sum+=(sum&gt;&gt;16);</code>
</div>
                                                                <div class="line number60 index59 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">answer=~sum;</code>
</div>
                                                                <div class="line number61 index60 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">answer;</code>
</div>
                                                                <div class="line number62 index61 alt1">
                                                                        <code class="cpp plain">}</code>
</div>
                                                                <div class="line number63 index62 alt2">
                                                                         </div>
                                                                <div class="line number64 index63 alt1">
                                                                        <code class="cpp keyword bold">struct</code> <code class="cpp plain">timeval cal_time_offset(</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">timeval begin, </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">timeval end)</code>
</div>
                                                                <div class="line number65 index64 alt2">
                                                                        <code class="cpp plain">{</code>
</div>
                                                                <div class="line number66 index65 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">timeval ans;</code>
</div>
                                                                <div class="line number67 index66 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">ans.tv_sec = end.tv_sec - begin.tv_sec;</code>
</div>
                                                                <div class="line number68 index67 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">ans.tv_usec = end.tv_usec - begin.tv_usec;</code>
</div>
                                                                <div class="line number69 index68 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(ans.tv_usec &lt; 0) </code><code class="cpp comments">//如果接收时间的usec小于发送时间的usec,则向sec域借位</code>
</div>
                                                                <div class="line number70 index69 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number71 index70 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">ans.tv_sec--;</code>
</div>
                                                                <div class="line number72 index71 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">ans.tv_usec+=1000000;</code>
</div>
                                                                <div class="line number73 index72 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number74 index73 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">ans;</code>
</div>
                                                                <div class="line number75 index74 alt2">
                                                                        <code class="cpp plain">}</code>
</div>
                                                                <div class="line number76 index75 alt1">
                                                                         </div>
                                                                <div class="line number77 index76 alt2">
                                                                        <code class="cpp keyword bold">void</code> <code class="cpp plain">icmp_pack(</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">icmp* icmphdr, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">seq, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">length)</code>
</div>
                                                                <div class="line number78 index77 alt1">
                                                                        <code class="cpp plain">{</code>
</div>
                                                                <div class="line number79 index78 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i = 0;</code>
</div>
                                                                <div class="line number80 index79 alt1">
                                                                         </div>
                                                                <div class="line number81 index80 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">icmphdr-&gt;icmp_type = ICMP_ECHO;</code>
</div>
                                                                <div class="line number82 index81 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">icmphdr-&gt;icmp_code = 0;</code>
</div>
                                                                <div class="line number83 index82 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">icmphdr-&gt;icmp_cksum = 0;</code>
</div>
                                                                <div class="line number84 index83 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">icmphdr-&gt;icmp_seq = seq;</code>
</div>
                                                                <div class="line number85 index84 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">icmphdr-&gt;icmp_id = pid &amp; 0xffff;</code>
</div>
                                                                <div class="line number86 index85 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">for</code><code class="cpp plain">(i=0;i&lt;length;i++)</code>
</div>
                                                                <div class="line number87 index86 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number88 index87 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">icmphdr-&gt;icmp_data = i;</code>
</div>
                                                                <div class="line number89 index88 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number90 index89 alt1">
                                                                         </div>
                                                                <div class="line number91 index90 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">icmphdr-&gt;icmp_cksum = cal_chksum((unsigned </code><code class="cpp color1 bold">short</code><code class="cpp plain">*)icmphdr, length);</code>
</div>
                                                                <div class="line number92 index91 alt1">
                                                                        <code class="cpp plain">}</code>
</div>
                                                                <div class="line number93 index92 alt2">
                                                                         </div>
                                                                <div class="line number94 index93 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">icmp_unpack(</code><code class="cpp color1 bold">char</code><code class="cpp plain">* buf, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">len)</code>
</div>
                                                                <div class="line number95 index94 alt2">
                                                                        <code class="cpp plain">{</code>
</div>
                                                                <div class="line number96 index95 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">iphdr_len;</code>
</div>
                                                                <div class="line number97 index96 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">timeval begin_time, recv_time, offset_time;</code>
</div>
                                                                <div class="line number98 index97 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">rtt; </code><code class="cpp comments">//round trip time</code>
</div>
                                                                <div class="line number99 index98 alt2">
                                                                         </div>
                                                                <div class="line number100 index99 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">ip* ip_hdr = (</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">ip *)buf;</code>
</div>
                                                                <div class="line number101 index100 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">iphdr_len = ip_hdr-&gt;ip_hl*4;</code>
</div>
                                                                <div class="line number102 index101 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">icmp* icmp = (</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">icmp*)(buf+iphdr_len);</code>
</div>
                                                                <div class="line number103 index102 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">len-=iphdr_len; </code><code class="cpp comments">//icmp包长度</code>
</div>
                                                                <div class="line number104 index103 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(len &lt; 8) </code><code class="cpp comments">//判断长度是否为ICMP包长度</code>
</div>
                                                                <div class="line number105 index104 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number106 index105 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">fprintf</code><code class="cpp plain">(stderr, </code><code class="cpp string">"Invalid icmp packet.Its length is less than 8\n"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number107 index106 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-1;</code>
</div>
                                                                <div class="line number108 index107 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number109 index108 alt2">
                                                                         </div>
                                                                <div class="line number110 index109 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp comments">//判断该包是ICMP回送回答包且该包是我们发出去的</code>
</div>
                                                                <div class="line number111 index110 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">((icmp-&gt;icmp_type == ICMP_ECHOREPLY) &amp;&amp; (icmp-&gt;icmp_id == pid)) </code>
</div>
                                                                <div class="line number112 index111 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number113 index112 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">if</code><code class="cpp plain">((icmp-&gt;icmp_seq &lt; 0) || (icmp-&gt;icmp_seq &gt; PACKET_SEND_MAX_NUM))</code>
</div>
                                                                <div class="line number114 index113 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number115 index114 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp functions bold">fprintf</code><code class="cpp plain">(stderr, </code><code class="cpp string">"icmp packet seq is out of range!\n"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number116 index115 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-1;</code>
</div>
                                                                <div class="line number117 index116 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number118 index117 alt1">
                                                                         </div>
                                                                <div class="line number119 index118 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">ping_packet.flag = 0;</code>
</div>
                                                                <div class="line number120 index119 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">begin_time = ping_packet.begin_time;</code>
</div>
                                                                <div class="line number121 index120 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">gettimeofday(&amp;recv_time, NULL);</code>
</div>
                                                                <div class="line number122 index121 alt1">
                                                                         </div>
                                                                <div class="line number123 index122 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">offset_time = cal_time_offset(begin_time, recv_time);</code>
</div>
                                                                <div class="line number124 index123 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">rtt = offset_time.tv_sec*1000 + offset_time.tv_usec/1000; </code><code class="cpp comments">//毫秒为单位</code>
</div>
                                                                <div class="line number125 index124 alt2">
                                                                         </div>
                                                                <div class="line number126 index125 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"%d byte from %s: icmp_seq=%u ttl=%d rtt=%d ms\n"</code><code class="cpp plain">,</code>
</div>
                                                                <div class="line number127 index126 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">len, inet_ntoa(ip_hdr-&gt;ip_src), icmp-&gt;icmp_seq, ip_hdr-&gt;ip_ttl, rtt);  </code>
</div>
                                                                <div class="line number128 index127 alt1">
                                                                         </div>
                                                                <div class="line number129 index128 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number130 index129 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">else</code>
</div>
                                                                <div class="line number131 index130 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number132 index131 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">fprintf</code><code class="cpp plain">(stderr, </code><code class="cpp string">"Invalid ICMP packet! Its id is not matched!\n"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number133 index132 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-1;</code>
</div>
                                                                <div class="line number134 index133 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number135 index134 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0;</code>
</div>
                                                                <div class="line number136 index135 alt1">
                                                                        <code class="cpp plain">}</code>
</div>
                                                                <div class="line number137 index136 alt2">
                                                                         </div>
                                                                <div class="line number138 index137 alt1">
                                                                        <code class="cpp keyword bold">void</code> <code class="cpp plain">ping_send()</code>
</div>
                                                                <div class="line number139 index138 alt2">
                                                                        <code class="cpp plain">{</code>
</div>
                                                                <div class="line number140 index139 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">send_buf;</code>
</div>
                                                                <div class="line number141 index140 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">memset</code><code class="cpp plain">(send_buf, 0, </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(send_buf));</code>
</div>
                                                                <div class="line number142 index141 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">gettimeofday(&amp;start_time, NULL); </code><code class="cpp comments">//记录第一个ping包发出的时间</code>
</div>
                                                                <div class="line number143 index142 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">while</code><code class="cpp plain">(alive)</code>
</div>
                                                                <div class="line number144 index143 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number145 index144 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">int</code> <code class="cpp plain">size = 0;</code>
</div>
                                                                <div class="line number146 index145 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">gettimeofday(&amp;(ping_packet.begin_time), NULL);</code>
</div>
                                                                <div class="line number147 index146 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">ping_packet.flag = 1; </code><code class="cpp comments">//将该标记为设置为该包已发送</code>
</div>
                                                                <div class="line number148 index147 alt1">
                                                                         </div>
                                                                <div class="line number149 index148 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">icmp_pack((</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">icmp*)send_buf, send_count, 64); </code><code class="cpp comments">//封装icmp包</code>
</div>
                                                                <div class="line number150 index149 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">size = sendto(rawsock, send_buf, 64, 0, (</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">sockaddr*)&amp;dest, </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(dest));</code>
</div>
                                                                <div class="line number151 index150 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">send_count++; </code><code class="cpp comments">//记录发出ping包的数量</code>
</div>
                                                                <div class="line number152 index151 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">if</code><code class="cpp plain">(size &lt; 0)</code>
</div>
                                                                <div class="line number153 index152 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number154 index153 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp functions bold">fprintf</code><code class="cpp plain">(stderr, </code><code class="cpp string">"send icmp packet fail!\n"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number155 index154 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp keyword bold">continue</code><code class="cpp plain">;</code>
</div>
                                                                <div class="line number156 index155 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number157 index156 alt2">
                                                                         </div>
                                                                <div class="line number158 index157 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">sleep(1);</code>
</div>
                                                                <div class="line number159 index158 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number160 index159 alt1">
                                                                        <code class="cpp plain">}</code>
</div>
                                                                <div class="line number161 index160 alt2">
                                                                         </div>
                                                                <div class="line number162 index161 alt1">
                                                                        <code class="cpp keyword bold">void</code> <code class="cpp plain">ping_recv()</code>
</div>
                                                                <div class="line number163 index162 alt2">
                                                                        <code class="cpp plain">{</code>
</div>
                                                                <div class="line number164 index163 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">timeval tv;</code>
</div>
                                                                <div class="line number165 index164 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">tv.tv_usec = 200; </code><code class="cpp comments">//设置select函数的超时时间为200us</code>
</div>
                                                                <div class="line number166 index165 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">tv.tv_sec = 0;</code>
</div>
                                                                <div class="line number167 index166 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">fd_set read_fd;</code>
</div>
                                                                <div class="line number168 index167 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">recv_buf;</code>
</div>
                                                                <div class="line number169 index168 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">memset</code><code class="cpp plain">(recv_buf, 0 ,</code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(recv_buf));</code>
</div>
                                                                <div class="line number170 index169 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">while</code><code class="cpp plain">(alive)</code>
</div>
                                                                <div class="line number171 index170 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number172 index171 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">int</code> <code class="cpp plain">ret = 0;</code>
</div>
                                                                <div class="line number173 index172 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">FD_ZERO(&amp;read_fd);</code>
</div>
                                                                <div class="line number174 index173 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">FD_SET(rawsock, &amp;read_fd);</code>
</div>
                                                                <div class="line number175 index174 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">ret = select(rawsock+1, &amp;read_fd, NULL, NULL, &amp;tv);</code>
</div>
                                                                <div class="line number176 index175 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">switch</code><code class="cpp plain">(ret)</code>
</div>
                                                                <div class="line number177 index176 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number178 index177 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp keyword bold">case</code> <code class="cpp plain">-1:</code>
</div>
                                                                <div class="line number179 index178 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp functions bold">fprintf</code><code class="cpp plain">(stderr,</code><code class="cpp string">"fail to select!\n"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number180 index179 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp keyword bold">break</code><code class="cpp plain">;</code>
</div>
                                                                <div class="line number181 index180 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp keyword bold">case</code> <code class="cpp plain">0:</code>
</div>
                                                                <div class="line number182 index181 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp keyword bold">break</code><code class="cpp plain">;</code>
</div>
                                                                <div class="line number183 index182 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp keyword bold">default</code><code class="cpp plain">:</code>
</div>
                                                                <div class="line number184 index183 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number185 index184 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp color1 bold">int</code> <code class="cpp plain">size = recv(rawsock, recv_buf, </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(recv_buf), 0);</code>
</div>
                                                                <div class="line number186 index185 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp keyword bold">if</code><code class="cpp plain">(size &lt; 0)</code>
</div>
                                                                <div class="line number187 index186 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number188 index187 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp functions bold">fprintf</code><code class="cpp plain">(stderr,</code><code class="cpp string">"recv data fail!\n"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number189 index188 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp keyword bold">continue</code><code class="cpp plain">;</code>
</div>
                                                                <div class="line number190 index189 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number191 index190 alt2">
                                                                         </div>
                                                                <div class="line number192 index191 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">ret = icmp_unpack(recv_buf, size); </code><code class="cpp comments">//对接收的包进行解封</code>
</div>
                                                                <div class="line number193 index192 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp keyword bold">if</code><code class="cpp plain">(ret == -1) </code><code class="cpp comments">//不是属于自己的icmp包,丢弃不处理</code>
</div>
                                                                <div class="line number194 index193 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number195 index194 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp keyword bold">continue</code><code class="cpp plain">;</code>
</div>
                                                                <div class="line number196 index195 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number197 index196 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">recv_count++; </code><code class="cpp comments">//接收包计数</code>
</div>
                                                                <div class="line number198 index197 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number199 index198 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp keyword bold">break</code><code class="cpp plain">;</code>
</div>
                                                                <div class="line number200 index199 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number201 index200 alt2">
                                                                         </div>
                                                                <div class="line number202 index201 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number203 index202 alt2">
                                                                        <code class="cpp plain">}</code>
</div>
                                                                <div class="line number204 index203 alt1">
                                                                         </div>
                                                                <div class="line number205 index204 alt2">
                                                                        <code class="cpp keyword bold">void</code> <code class="cpp plain">icmp_sigint(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">signo)</code>
</div>
                                                                <div class="line number206 index205 alt1">
                                                                        <code class="cpp plain">{</code>
</div>
                                                                <div class="line number207 index206 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">alive = 0;</code>
</div>
                                                                <div class="line number208 index207 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">gettimeofday(&amp;end_time, NULL);</code>
</div>
                                                                <div class="line number209 index208 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">time_interval = cal_time_offset(start_time, end_time);</code>
</div>
                                                                <div class="line number210 index209 alt1">
                                                                        <code class="cpp plain">}</code>
</div>
                                                                <div class="line number211 index210 alt2">
                                                                         </div>
                                                                <div class="line number212 index211 alt1">
                                                                        <code class="cpp keyword bold">void</code> <code class="cpp plain">ping_stats_show()</code>
</div>
                                                                <div class="line number213 index212 alt2">
                                                                        <code class="cpp plain">{</code>
</div>
                                                                <div class="line number214 index213 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">long</code> <code class="cpp functions bold">time</code> <code class="cpp plain">= time_interval.tv_sec*1000+time_interval.tv_usec/1000;</code>
</div>
                                                                <div class="line number215 index214 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp comments">/*注意除数不能为零,这里send_count有可能为零,所以运行时提示错误*/</code>
</div>
                                                                <div class="line number216 index215 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"%d packets transmitted, %d recieved, %d%c packet loss, time %ldms\n"</code><code class="cpp plain">,</code>
</div>
                                                                <div class="line number217 index216 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">send_count, recv_count, (send_count-recv_count)*100/send_count, </code><code class="cpp string">'%'</code><code class="cpp plain">, </code><code class="cpp functions bold">time</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number218 index217 alt1">
                                                                        <code class="cpp plain">}</code>
</div>
                                                                <div class="line number219 index218 alt2">
                                                                         </div>
                                                                <div class="line number220 index219 alt1">
                                                                         </div>
                                                                <div class="line number221 index220 alt2">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">main(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">argc, </code><code class="cpp color1 bold">char</code><code class="cpp plain">* argv[])</code>
</div>
                                                                <div class="line number222 index221 alt1">
                                                                        <code class="cpp plain">{</code>
</div>
                                                                <div class="line number223 index222 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">size = 128*1024;</code><code class="cpp comments">//128k</code>
</div>
                                                                <div class="line number224 index223 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">protoent* protocol = NULL;</code>
</div>
                                                                <div class="line number225 index224 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">dest_addr_str;</code>
</div>
                                                                <div class="line number226 index225 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">memset</code><code class="cpp plain">(dest_addr_str, 0, 80);</code>
</div>
                                                                <div class="line number227 index226 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">unsigned </code><code class="cpp color1 bold">int</code> <code class="cpp plain">inaddr = 1;</code>
</div>
                                                                <div class="line number228 index227 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">hostent* host = NULL;</code>
</div>
                                                                <div class="line number229 index228 alt2">
                                                                         </div>
                                                                <div class="line number230 index229 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">pthread_t send_id,recv_id;</code>
</div>
                                                                <div class="line number231 index230 alt2">
                                                                         </div>
                                                                <div class="line number232 index231 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(argc &lt; 2)</code>
</div>
                                                                <div class="line number233 index232 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number234 index233 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"Invalid IP ADDRESS!\n"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number235 index234 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-1;</code>
</div>
                                                                <div class="line number236 index235 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number237 index236 alt2">
                                                                         </div>
                                                                <div class="line number238 index237 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">protocol = getprotobyname(</code><code class="cpp string">"icmp"</code><code class="cpp plain">); </code><code class="cpp comments">//获取协议类型ICMP</code>
</div>
                                                                <div class="line number239 index238 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(protocol == NULL)</code>
</div>
                                                                <div class="line number240 index239 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number241 index240 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"Fail to getprotobyname!\n"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number242 index241 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-1;</code>
</div>
                                                                <div class="line number243 index242 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number244 index243 alt1">
                                                                         </div>
                                                                <div class="line number245 index244 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">memcpy</code><code class="cpp plain">(dest_addr_str, argv, </code><code class="cpp functions bold">strlen</code><code class="cpp plain">(argv)+1);</code>
</div>
                                                                <div class="line number246 index245 alt1">
                                                                         </div>
                                                                <div class="line number247 index246 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">rawsock = socket(AF_INET,SOCK_RAW,protocol-&gt;p_proto);</code>
</div>
                                                                <div class="line number248 index247 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(rawsock &lt; 0)</code>
</div>
                                                                <div class="line number249 index248 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number250 index249 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"Fail to create socket!\n"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number251 index250 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-1;</code>
</div>
                                                                <div class="line number252 index251 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number253 index252 alt2">
                                                                         </div>
                                                                <div class="line number254 index253 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">pid = getpid();</code>
</div>
                                                                <div class="line number255 index254 alt2">
                                                                         </div>
                                                                <div class="line number256 index255 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">setsockopt(rawsock, SOL_SOCKET, SO_RCVBUF, &amp;size, </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(size)); </code><code class="cpp comments">//增大接收缓冲区至128K</code>
</div>
                                                                <div class="line number257 index256 alt2">
                                                                         </div>
                                                                <div class="line number258 index257 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">bzero(&amp;dest,</code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(dest));</code>
</div>
                                                                <div class="line number259 index258 alt2">
                                                                         </div>
                                                                <div class="line number260 index259 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">dest.sin_family = AF_INET;</code>
</div>
                                                                <div class="line number261 index260 alt2">
                                                                         </div>
                                                                <div class="line number262 index261 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">inaddr = inet_addr(argv);</code>
</div>
                                                                <div class="line number263 index262 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(inaddr == INADDR_NONE) </code><code class="cpp comments">//判断用户输入的是否为IP地址还是域名</code>
</div>
                                                                <div class="line number264 index263 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number265 index264 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp comments">//输入的是域名地址</code>
</div>
                                                                <div class="line number266 index265 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">host = gethostbyname(argv);</code>
</div>
                                                                <div class="line number267 index266 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">if</code><code class="cpp plain">(host == NULL)</code>
</div>
                                                                <div class="line number268 index267 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number269 index268 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"Fail to gethostbyname!\n"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number270 index269 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-1;</code>
</div>
                                                                <div class="line number271 index270 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number272 index271 alt1">
                                                                         </div>
                                                                <div class="line number273 index272 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">memcpy</code><code class="cpp plain">((</code><code class="cpp color1 bold">char</code><code class="cpp plain">*)&amp;dest.sin_addr, host-&gt;h_addr, host-&gt;h_length);</code>
</div>
                                                                <div class="line number274 index273 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number275 index274 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">else</code>
</div>
                                                                <div class="line number276 index275 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number277 index276 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">memcpy</code><code class="cpp plain">((</code><code class="cpp color1 bold">char</code><code class="cpp plain">*)&amp;dest.sin_addr, &amp;inaddr, </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(inaddr));</code><code class="cpp comments">//输入的是IP地址</code>
</div>
                                                                <div class="line number278 index277 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number279 index278 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">inaddr = dest.sin_addr.s_addr;</code>
</div>
                                                                <div class="line number280 index279 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"PING %s, (%d.%d.%d.%d) 56(84) bytes of data.\n"</code><code class="cpp plain">,dest_addr_str,</code>
</div>
                                                                <div class="line number281 index280 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">(inaddr&amp;0x000000ff), (inaddr&amp;0x0000ff00)&gt;&gt;8, </code>
</div>
                                                                <div class="line number282 index281 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">(inaddr&amp;0x00ff0000)&gt;&gt;16, (inaddr&amp;0xff000000)&gt;&gt;24);</code>
</div>
                                                                <div class="line number283 index282 alt2">
                                                                         </div>
                                                                <div class="line number284 index283 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">alive = 1; </code><code class="cpp comments">//控制ping的发送和接收</code>
</div>
                                                                <div class="line number285 index284 alt2">
                                                                         </div>
                                                                <div class="line number286 index285 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">signal</code><code class="cpp plain">(SIGINT, icmp_sigint);</code>
</div>
                                                                <div class="line number287 index286 alt2">
                                                                         </div>
                                                                <div class="line number288 index287 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(pthread_create(&amp;send_id, NULL, (</code><code class="cpp keyword bold">void</code><code class="cpp plain">*)ping_send, NULL))</code>
</div>
                                                                <div class="line number289 index288 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number290 index289 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"Fail to create ping send thread!\n"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number291 index290 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-1;</code>
</div>
                                                                <div class="line number292 index291 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number293 index292 alt2">
                                                                         </div>
                                                                <div class="line number294 index293 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(pthread_create(&amp;recv_id, NULL, (</code><code class="cpp keyword bold">void</code><code class="cpp plain">*)ping_recv, NULL))</code>
</div>
                                                                <div class="line number295 index294 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number296 index295 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"Fail to create ping recv thread!\n"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number297 index296 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-1;</code>
</div>
                                                                <div class="line number298 index297 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number299 index298 alt2">
                                                                         </div>
                                                                <div class="line number300 index299 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">pthread_join(send_id, NULL);</code><code class="cpp comments">//等待send ping线程结束后进程再结束</code>
</div>
                                                                <div class="line number301 index300 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">pthread_join(recv_id, NULL);</code><code class="cpp comments">//等待recv ping线程结束后进程再结束</code>
</div>
                                                                <div class="line number302 index301 alt1">
                                                                         </div>
                                                                <div class="line number303 index302 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">ping_stats_show();</code>
</div>
                                                                <div class="line number304 index303 alt1">
                                                                         </div>
                                                                <div class="line number305 index304 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">close(rawsock);</code>
</div>
                                                                <div class="line number306 index305 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0;</code>
</div>
                                                                <div class="line number307 index306 alt2">
                                                                         </div>
                                                                <div class="line number308 index307 alt1">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        编译以及实验现象如下:<br>
        我的实验环境是两台服务器,发起ping的主机是172.0.5.183,被ping的主机是172.0.5.182,以下是我的两次实验现象(ping IP和ping 域名)。</p>
<p>
        <span><strong>特别注意:</strong></span></p>
<p>
        只有root用户才能利用socket()函数生成原始套接字,要让Linux的一般用户能执行以上程序,需进行如下的特别操作:用root登陆,编译以上程序gcc -lpthread -o ping ping.c</p>
<p>
        <img title="Linux编程之PING实现" alt="Linux编程之PING实现" src="https://zhuji.jb51.net/uploads/img/202305/d7db0ff2a4bf6c460a3868e5223c8770.jpg"></p>
<p>
        实验现象可以看出,PING是成功的,表明两主机间的网络是通的,发出的所有ping包都收到了回复。</p>
<p>
        下面是Linux系统自带的PING程序,我们可以对比一下我们设计的PING程序跟系统自带的PING程序有何不同。</p>
<p>
        <img title="Linux编程之PING实现" alt="Linux编程之PING实现" src="https://zhuji.jb51.net/uploads/img/202305/0173f8be96e5e96cdc8f2556a2d46bf1.jpg"></p>
<p>
        以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。</p>
頁: [1]
查看完整版本: Linux编程之PING实现