<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地址、源IP地址等,并且需要該ARP包進行廣播出去,所以以太網首部的目標MAC地址為FF-FF-FF-FF-FF-FF,源碼具體見代碼清單 10?7。 ``` 1 /*發送原始ARP數據包(操作碼和所有地址都可以修改) 2 * @param netif用于發送ARP數據包的lwip網絡接口 3 * @param ethsrc_addr以太網頭的源MAC地址 4 * @param ethdst_addr以太網頭的目標MAC地址 5 * @param hwsrc_addr ARP協議頭的源MAC地址 6 * @param ipsrc_addr ARP協議頭的源IP地址 7 * @param hwdst_addr ARP協議頭的目標MAC地址 8 * @param ipdst_addr ARP協議頭的目標IP地址 9 * @param操作編碼ARP數據包的類型 10 * @return ERR_OK如果已發送ARP數據包 11 * 如果無法分配ARP數據包,則為ERR_MEM 12 */ 13 static err_t 14 etharp_raw(struct netif *netif, //用于發送ARP數據包的lwip網絡接口 15 const struct eth_addr *ethsrc_addr,//以太網頭的源MAC地址 16 const struct eth_addr *ethdst_addr,//以太網頭的目標MAC地址 17 const struct eth_addr *hwsrc_addr,//ARP協議頭的源MAC地址 18 const ip4_addr_t *ipsrc_addr,//ARP協議頭的源IP地址 19 const struct eth_addr *hwdst_addr, //ARP協議頭的目標MAC地址 20 const ip4_addr_t *ipdst_addr,// ARP協議頭的目標IP地址 21 const u16_t opcode)//操作編碼ARP數據包的類型(op字段) 22 { 23 struct pbuf *p; 24 err_t result = ERR_OK; 25 struct etharp_hdr *hdr; 26 27 //申請ARP報文的內存空間 28 p = pbuf_alloc(PBUF_LINK, SIZEOF_ETHARP_HDR, PBUF_RAM); 29 30 if (p == NULL) 31 { 32 ETHARP_STATS_INC(etharp.memerr);//內存申請失敗,返回錯誤代碼 33 return ERR_MEM; 34 } 35 36 //ARP報文的數據區域,并且強制將起始地址轉化成ARP報文首部 37 hdr = (struct etharp_hdr *)p->payload; 38 39 hdr->opcode = lwip_htons(opcode); //填寫ARP數據包的op字段 40 41 //填寫源MAC地址 42 SMEMCPY(&hdr->shwaddr, hwsrc_addr, ETH_HWADDR_LEN); 43 //填寫目標MAC地址 44 SMEMCPY(&hdr->dhwaddr, hwdst_addr, ETH_HWADDR_LEN); 45 46 //以太網首部源MAC地址 47 IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(&hdr->sipaddr, ipsrc_addr); 48 / 49 //以太網首部目標MAC地址 50 IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(&hdr->dipaddr, ipdst_addr); 51 52 //填寫ARP首部硬件類型 53 hdr->hwtype = PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET); 54 //填寫ARP首部協議類型 55 hdr->proto = PP_HTONS(ETHTYPE_IP); 56 57 //填寫ARP數據包硬件地址長度 58 hdr->hwlen = ETH_HWADDR_LEN; 59 //填寫ARP數據包協議地址長度 60 hdr->protolen = sizeof(ip4_addr_t); 61 62 //調用底層發送函數將以太網數據幀發送出去 63 ethernet_output(netif, p, ethsrc_addr, ethdst_addr, ETHTYPE_ARP); 64 65 ETHARP_STATS_INC(etharp.xmit); 66 67 pbuf_free(p);//發送完成釋放內存 68 p = NULL; 69 70 return result; //返回結果 71 } 72 73 //FF-FF-FF-FF-FF-FF 74 const struct eth_addr ethbroadcast = 75 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}; 76 //00-00-00-00-00-00 77 const struct eth_addr ethzero = {{0, 0, 0, 0, 0, 0}}; 78 79 //發送ARP請求包,指定目標MAC地址 80 static err_t 81 etharp_request_dst(struct netif *netif, 82 const ip4_addr_t *ipaddr, 83 const struct eth_addr *hw_dst_addr) 84 { 85 return etharp_raw(netif, 86 (struct eth_addr *)netif->hwaddr, 87 hw_dst_addr, 88 (struct eth_addr *)netif->hwaddr, 89 netif_ip4_addr(netif), &ethzero, 90 ipaddr, ARP_REQUEST); 91 } 92 93 //發送ARP請求包,目標MAC地址為 ethbroadcast 94 err_t 95 etharp_request(struct netif *netif, const ip4_addr_t *ipaddr) 96 { 97 return etharp_request_dst(netif, ipaddr, &ethbroadcast); 98 } ``` 總的來說就是先調用etharp\_request()函數進行發送ARP請求包,在etharp\_request()函數中會調用etharp\_request\_dst()函數進行發送,此時指定的目標MAC地址是ethbroadcast,而在etharp\_request\_dst()函數中會調用etharp\_raw()進行發送ARP請求包,層層調用,并且每層的參數都是越來越多的,這樣子封裝對于上層程序來說更加好處理,在etharp\_raw()函數中,會對ARP數據包進行封裝,然后再封裝到以太網數據幀中,最終調用以太網底層發送函數進行將以太網數據幀發送出去。
                  <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>

                              哎呀哎呀视频在线观看