作者:
?? 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
飛鳥 閱讀(359)
評論(0) 編輯 收藏 所屬分類:
VC