发送arp包的代码如下
// SendARP.cpp文件
#include <windows.h>
#include <stdio.h>
#include "conio.h"
#include "Iphlpapi.h"
#pragma comment(lib, "Iphlpapi.lib")
#pragma comment(lib, "WS2_32.lib")
void main()
{
char szDestIP[] = "172.16.8.18";//不能是本地地址,需改成目的ip地址
// 发送ARP请求
u_char arDestMac[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
printf("IP地址对应的MAC地址为:\n\n");
ULONG ulLen = 6;
if(SendARP(inet_addr(szDestIP), 0, (ULONG*)arDestMac, &ulLen) == NO_ERROR)
{
// 打印出结果
u_char *p = arDestMac;
printf(" pEtherh->shost: %02X-%02X-%02X-%02X-%02X-%02X \n", p[0], p[1], p[2], p[3], p[4], p[5]);
}
getch();
}
发送端在运行此代码时,向接收端发送ARP包,可在接收端抓包查看,我使用的抓包软件为西普阳光,此软件需创建账号,wireshark应该也行。
抓取数据包如下
第一个数据包是发送方发送给接收方,Ethernet Ⅱ中目标物理地址为FF-FF-FF-FF-FF-FF是因为arp包是群发给子网中所有主机,然后只有ip和物理地址相符的主机才会接收数据包。源物理地址为发送方的物理地址,数据的协议类型为0x0806表示数据类型为arp。
第二个数据包为目标主机接收到数据后返回的应答数据包,Ethernet Ⅱ中目标物理地址为确定的对方主机的物理地址。