手把手教你玩转ARP包(二)【数据包的游戏系列之一】(转)
http://blog.csdn.net/piggyxp/archive/2004/05/31/19607.aspx
作者:
一. 关于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包的编程实现
- 填充数据包
上面的那些关于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;
这些结构体一定能看懂吧,在程序中就是对号入座就好了
.................