隨筆-17  評論-64  文章-79  trackbacks-1
          作者:
          ?? CSDN? VC/MFC 網絡編程PiggyXP ?^_^
          ?
          ? 目錄:

          ??? 一??? 關于 ARP 協議的基礎知識

          ???? 3. ARP包的填充

          二。發送數據包的編程實現

          ?? 1.填充數據包

          ?

          .........................緊接上文............................

          ?

          3.ARP 包的填充
          1) 請求包的填充:
          ?????比如我們的電腦MAC地址為 aa-aa-aa-aa-aa-aa,IP為 192.168.0.1
          ?我們想要查詢 192.168.0.99的MAC地址,應該怎么來做呢?
          ?
          ?????首先填充DLC Header,通過前面的學習我們知道,想要知道某個計算機對應的MAC地址是要給全網發送廣播的,所以接收方MAC肯定是 ffffffffffff,發送方MAC當然是自己啦, 于是我們的DLC Header就填充完成了,如圖,加粗的是我們要手動輸入的值(當然我編的程序比較智能,會根據你選擇的ARP包類型幫你自動填入一些字段,你一用便知^_^)。
          ?
          DLC Header
          字段
          長度(Byte)
          填充值
          接收方MAC
          6
          ffffffffffff
          發送方MAC
          6
          aaaaaaaaaaaa
          Ethertype
          2
          0x0806
          圖3 ARP請求包中 DLC Header內容
          ?
          ??? 接下來是ARP幀,請求包的操作碼當然是 1,送方的MAC以及IP當然填入我們自己的,然后要注意一下,這里的接收方IP填入我們要查詢的那個IP地址,就是192.168.0.99了,而接收方MAC填入任意值就行,不起作用,于是,如圖,
          ?
          ??????????????????????????? ARP Frame
          字段
          長度(Byte)
          填充值
          硬件類型
          2
          1
          上層協議類型
          2
          0800
          MAC地址長度
          1
          6
          IP地址長度
          1
          4
          操作碼
          2
          1
          發送方MAC
          6
          aaaaaaaaaaaa
          發送方IP
          4
          192.168.0.1
          接收方MAC
          6
          任意值 xxxxxxxxxxxx
          接收方IP
          4
          192.168.0.99
          填充數據
          18
          0
          ???????????????? 圖4 ARP請求包中 ARP幀的內容
          ?
          ??? 如果我們構造一個這樣的包發送出去,如果 192.168.0.99存在且是活動的,我們馬上就會收到一個192.168.0.99發來的一個響應包,我們可以查看一下我們的ARP緩存列表,是不是多了一項類似這樣的條 目: ???????????
          ?????? 192.168.0.99????????????????? bb-bb-bb-bb-bb-bb
          ???? 是不是很神奇呢?
          ???? 我們再來看一下ARP響應包的構造
          ?
          2) 響應包的填充
          ???? 有了前面詳細的解說,你肯定就能自己說出響應包的填充方法來了吧,所以我就不細說了,列兩個表就好了
          ?
          ???? 比如說給 192.168.0.99(MAC為 bb-bb-bb-bb-bb-bb)發一個ARP響應包,告訴它我們的MAC地址為 aa-aa-aa-aa-aa-aa,就是如此來填充各個字段
          ?
          DLC Header
          字段
          長度(Byte)
          填充值
          接收方MAC
          6
          bbbbbbbbbbbb
          發送方MAC
          6
          aaaaaaaaaaaa
          Ethertype
          2
          0x0806
          ????????????? 圖5 ARP響應包中 DLC Header內容
          ?
          ARP Frame
          字段
          長度(Byte)
          填充值
          硬件類型
          2
          1
          上層協議類型
          2
          0800
          MAC地址長度
          1
          6
          IP地址長度
          1
          4
          操作碼
          2
          2
          發送方MAC
          6
          aaaaaaaaaaaa
          發送方IP
          4
          192.168.0.1
          接收方MAC
          6
          bbbbbbbbbbbb
          接收方IP
          4
          192.168.0.99
          填充數據
          18
          0
          ????????? 圖6 ARP響應包中 ARP幀的內容
          ?
          ??? 這樣192.168.0.99的ARP緩存中就會多了一條關于我們192.168.0.1的地址映射。
          ??? 好了,終于到了編程實現它的時候了^_^
          ?

          二.? 發送 ARP 包的編程實現

          1.??????? 填充數據包

          上面的那些關于 ARP 包各個字段的表格,對應在程序里就是結構體, 對應于上面的表格, 于是我們需要三個下面這樣的結構體

          // DLC Header

          typedef struct tagDLCHeader????????????????????

          {

          ?? unsigned char ????? DesMAC[6];???????????? /* destination HW addrress */

          ?? unsigned char ????? SrcMAC[6];???????????? /* source HW addresss */

          ?? unsigned short ???? Ethertype;???????????? ?? /* ethernet type */

          } DLCHEADER, *PDLCHEADER;

          // ARP Frame

          typedef struct tagARPFrame?????????????????????

          {

          ???? ???? unsigned short ???????? HW_Type;?????????? /* hardware address */

          ???? ???? unsigned short ???????? Prot_Type;???????????? /* protocol address */

          ???? ???? unsigned char ????? HW_Addr_Len;?????? /* length of hardware address */

          ???? ???? unsigned char ????? Prot_Addr_Len;???????? /* length of protocol address */

          ???? ???? unsigned short ???????? Opcode;??????????? ??? /* ARP/RARP */

          ?

          ???? ???? unsigned char ????? Send_HW_Addr[6];???? /* sender hardware address */

          ???? ???? unsigned long ????? Send_Prot_Addr;????? /* sender protocol address */

          ???? ???? unsigned char ????? Targ_HW_Addr[6];???? /* target hardware address */

          ???? ???? unsigned long ????? Targ_Prot_Addr;????? /* target protocol address */

          ???? ???? unsigned char ????? padding[18];

          } ARPFRAME, *PARPFRAME;

          // ARP Packet = DLC header + ARP Frame

          typedef struct tagARPPacket????????????????

          {

          ???? DLCHEADER???? dlcHeader;

          ???? ARPFRAME????? arpFrame;

          } ARPPACKET, *PARPPACKET;

          ?

          這些結構體一定能看懂吧 在程序中就是對號入座就好了

          posted on 2007-02-16 15:41 飛鳥 閱讀(363) 評論(0)  編輯  收藏 所屬分類: VC
          主站蜘蛛池模板: 乐山市| 宜宾县| 萨迦县| 新源县| 肥东县| 怀宁县| 信宜市| 宁波市| 察隅县| 岳阳县| 囊谦县| 宁河县| 烟台市| 曲靖市| 墨竹工卡县| 尚义县| 济南市| 梨树县| 松滋市| 丘北县| 靖州| 阳谷县| 潼南县| 广丰县| 井冈山市| 托克托县| 体育| 屏山县| 池州市| 成安县| 龙门县| 万年县| 嫩江县| 比如县| 瑞安市| 湛江市| 秦皇岛市| 六枝特区| 通州区| 鸡东县| 当阳市|