<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                這個函數是ARP找到了IP地址與MAC地址對應的表項,從而能直接進行發送,除此之外,ARP還需要更新ARP表項,我們知道,LwIP中的ARP表項生存時間是5分鐘(300秒),那么在APP表項的生存時間即將到來的時候,ARP需要更新表項,為什么要在發送數據的時候更新呢?因為如果不發送數據,那就沒必要更新ARP表項,這樣子表項在生存時間到來的時候就會被系統刪除,回收ARP表項空間,而一直使用的ARP表項需要是誰更新,更新的方式也有兩種: 如果ARP表項還差15秒就過期了,LwIP會通過廣播的方式發送一個ARP請求包,試圖得到主機的回應。 而如果ARP表項還差30秒就過期了,那么LwIP會通過單播的方式向目標主機發送一個請求包并試圖得到回應。 在這種情況下發送ARP請求包的時候,表項的狀態會由ETHARP\_STATE\_STABLE變成ETHARP\_STATE\_STABLE\_REREQUESTING\_1,如果目標主機回應了,那就更新ARP緩存表中的表項。 當然,如果還沒那么快到期的話,那就直接調用ethernet\_output()函數將數據包傳遞給網卡進行發送。函數源碼具體見代碼清單 10?12 ``` 1 #define ARP_MAXAGE 300 2 3 /* 即將到期的時間 */ 4 #define ARP_AGE_REREQUEST_USED_UNICAST (ARP_MAXAGE - 30) 5 #define ARP_AGE_REREQUEST_USED_BROADCAST (ARP_MAXAGE - 15) 6 7 static err_t 8 etharp_output_to_arp_index(struct netif *netif, 9 struct pbuf *q, 10 netif_addr_idx_t arp_idx) 11 { 12 LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE", 13 arp_table[arp_idx].state >= ETHARP_STATE_STABLE); 14 /* 如果arp表項即將過期:LwIP會重新請求它, 15 但只有當它的狀態是ETHARP_STATE_STABLE才能請求*/ 16 if (arp_table[arp_idx].state == ETHARP_STATE_STABLE) 17 { 18 /* 還差15秒到期 */ 19 if (arp_table[arp_idx].ctime >= ARP_AGE_REREQUEST_USED_BROADCAST) 20 { 21 /* 使用廣播方式發出請求包 */ 22 if (etharp_request(netif, &arp_table[arp_idx].ipaddr) == ERR_OK) 23 { 24 arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING_1; 25 } 26 } 27 /* 還差30秒到期 */ 28 else if (arp_table[arp_idx].ctime >= ARP_AGE_REREQUEST_USED_UNICAST) 29 { 30 /* 發出單播請求(持續15秒),以防止不必要的廣播 */ 31 if (etharp_request_dst(netif, 32 &arp_table[arp_idx].ipaddr, 33 &arp_table[arp_idx].ethaddr) == ERR_OK) 34 { 35 arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING_1; 36 } 37 } 38 } 39 40 return ethernet_output(netif, q, 41 (struct eth_addr *)(netif->hwaddr), 42 &arp_table[arp_idx].ethaddr, ETHTYPE_IP); 43 } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看