作者:
CSDN VC/MFC 網(wǎng)絡(luò)編程 PiggyXP ^_^
目錄:
一. 關(guān)于ARP協(xié)議的基礎(chǔ)知識(shí) 3. ARP包的填充 二。發(fā)送數(shù)據(jù)包的編程實(shí)現(xiàn) 1.填充數(shù)據(jù)包
.........................緊接上文............................
3.ARP包的填充
1) 請(qǐng)求包的填充:
比如我們的電腦MAC地址為 aa-aa-aa-aa-aa-aa,IP為 192.168.0.1
我們想要查詢 192.168.0.99的MAC地址,應(yīng)該怎么來做呢?
首先填充DLC Header,通過前面的學(xué)習(xí)我們知道,想要知道某個(gè)計(jì)算機(jī)對(duì)應(yīng)的MAC地址是要給全網(wǎng)發(fā)送廣播的,所以接收方MAC肯定是 ffffffffffff,發(fā)送方MAC當(dāng)然是自己啦,于是我們的DLC Header就填充完成了,如圖,加粗的是我們要手動(dòng)輸入的值(當(dāng)然我編的程序比較智能,會(huì)根據(jù)你選擇的ARP包類型幫你自動(dòng)填入一些字段,你一用便知^_^)。
圖3 ARP請(qǐng)求包中 DLC Header內(nèi)容
接下來是ARP幀,請(qǐng)求包的操作碼當(dāng)然是 1,發(fā)送方的MAC以及IP當(dāng)然填入我們自己的,然后要注意一下,這里的接收方IP填入我們要查詢的那個(gè)IP地址,就是192.168.0.99了,而接收方MAC填入任意值就行,不起作用,于是,如圖,
圖4 ARP請(qǐng)求包中 ARP幀的內(nèi)容
如果我們構(gòu)造一個(gè)這樣的包發(fā)送出去,如果 192.168.0.99存在且是活動(dòng)的,我們馬上就會(huì)收到一個(gè)192.168.0.99發(fā)來的一個(gè)響應(yīng)包,我們可以查看一下我們的ARP緩存列表,是不是多了一項(xiàng)類似這樣的條目:
192.168.0.99 bb-bb-bb-bb-bb-bb
是不是很神奇呢?
我們?cè)賮砜匆幌翧RP響應(yīng)包的構(gòu)造
2) 響應(yīng)包的填充
有了前面詳細(xì)的解說,你肯定就能自己說出響應(yīng)包的填充方法來了吧,所以我就不細(xì)說了,列兩個(gè)表就好了
比如說給 192.168.0.99(MAC為 bb-bb-bb-bb-bb-bb)發(fā)一個(gè)ARP響應(yīng)包,告訴它我們的MAC地址為 aa-aa-aa-aa-aa-aa,就是如此來填充各個(gè)字段
圖5 ARP響應(yīng)包中 DLC Header內(nèi)容
圖6 ARP響應(yīng)包中 ARP幀的內(nèi)容
這樣192.168.0.99的ARP緩存中就會(huì)多了一條關(guān)于我們192.168.0.1的地址映射。
好了,終于到了編程實(shí)現(xiàn)它的時(shí)候了^_^
二. 發(fā)送ARP包的編程實(shí)現(xiàn) 1. 填充數(shù)據(jù)包 上面的那些關(guān)于ARP包各個(gè)字段的表格,對(duì)應(yīng)在程序里就是結(jié)構(gòu)體,對(duì)應(yīng)于上面的表格,于是我們需要三個(gè)下面這樣的結(jié)構(gòu)體 // 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; 這些結(jié)構(gòu)體一定能看懂吧,在程序中就是對(duì)號(hào)入座就好了
==================================================================
不爽這么快又滿了,文章不知道要拆成幾份了..-_-b
請(qǐng)期待下文 : )
----- Finished at 2004-05-29 19:41
|
|