作者:
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
飞鸟 阅读(356)
评论(0) 编辑 收藏 所属分类:
VC