??? 一.???
關于
ARP
協議的基礎知識
???? 3. ARP包的填充
二。發送數據包的編程實現
?? 1.填充數據包
?
.........................緊接上文............................
?
DLC Header
|
||
字段
|
長度(Byte)
|
填充值
|
接收方MAC
|
6
|
ffffffffffff
|
發送方MAC
|
6
|
aaaaaaaaaaaa
|
Ethertype
|
2
|
0x0806
|
??????????????????????????? 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
|
DLC Header
|
||
字段
|
長度(Byte)
|
填充值
|
接收方MAC
|
6
|
bbbbbbbbbbbb
|
發送方MAC
|
6
|
aaaaaaaaaaaa
|
Ethertype
|
2
|
0x0806
|
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
|
二.?
發送
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;
這些結構體一定能看懂吧 , 在程序中就是對號入座就好了