ARP协议学习笔记

一、准备工作:

1、本机环境:Windows XP SP3、电信ADSL 2M家庭宽带

2、开发工具:WildPackets OmniPeek V5.1.4

                    Visual C++ 6.0

                    FlexEdit V2.3.1871

 

二、ARP协议概念:

1、ARP的数据结构

typedef struct arphdr { unsigned short arp_hdr; unsigned short arp_pro; unsigned char arp_hln; unsigned char arp_pln; unsigned short arp_opt; unsigned char arp_sha[6]; unsigned long arp_spa; unsigned char arp_tha[6]; unsigned long arp_tpa; }ARPHDR,*PARPHDR;

 

2、ARP和RARP使用相同的报头结构,如图所示。
ARP协议学习笔记_第1张图片

  硬件类型字段:指明了发送方想知道的硬件接口类型,以太网的值为1;

  协议类型字段:指明了发送方提供的高层协议类型,IP为0800(16进制);

  硬件地址长度和协议长度:指明了硬件地址和高层协议地址的长度,这样ARP报文就可以在任意硬件和任意协议的网络中使用;

  操作字段:用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4;

  发送方的硬件地址(0-2字节):源主机硬件地址的前3个字节;

  发送方的硬件地址(3-5字节):源主机硬件地址的后3个字节;

  发送方IP(0-1字节):源主机硬件地址的前2个字节;

  发送方IP(2-3字节):源主机硬件地址的后2个字节;

  目的硬件地址(0-1字节):目的主机硬件地址的前2个字节;

  目的硬件地址(2-5字节):目的主机硬件地址的后4个字节;

  目的IP(0-3字节):目的主机的IP地址。

 

三、分析数据包:

1、先看ARP请求(ARP  Request):

ARP协议学习笔记_第2张图片

2、再看ARP应答(ARP  Response):

ARP协议学习笔记_第3张图片

 

四、相关代码:

1、下面是MSDN中实例代码,用来向指定IP地址发送ARP请求,来获取他的MAC地址:

// SendARP.cpp : Defines the entry point for the console application. // ARP 协议学习笔记 // By Koma 09:47 2009-09-12 #include <windows.h> #include <stdio.h> #include <tchar.h> #include <iphlpapi.h> #include <Winsock2.h> #pragma comment(lib,"Ws2_32.lib") #pragma comment(lib,"iphlpapi.lib") int main(int argc, char* argv[]) { HRESULT hr; IPAddr ipAddr; ULONG pulMac[2]; ULONG ulLen; char* pstrIP = "192.168.1.121"; ipAddr = inet_addr(pstrIP); ulLen = 6; memset(pulMac, 0xff, sizeof (pulMac)); hr = SendARP (ipAddr, 0, pulMac, &ulLen); if(NO_ERROR == hr) { printf ("返回信息:%08x,返回长度:%8d/n", hr, ulLen); size_t i, j; char * szMac = new char[ulLen*3]; PBYTE pbHexMac = (PBYTE) pulMac; // Convert the binary MAC address into human-readable memset(szMac,0,sizeof(szMac)); memset(pbHexMac,0,sizeof(pbHexMac)); for (i = 0, j = 0; i < ulLen - 1; ++i) { j += sprintf (szMac + j, "%02X:", pbHexMac[i]); } sprintf (szMac + j, "%02X", pbHexMac[i]); printf ("返回MAC地址为:%s/n", szMac); delete [] szMac; } else { // Error. printf("IP地址:%s不存在,或被防火墙拦截!/n",pstrIP); } return 0; }

 

2、程序运行效果:

运行效果

你可能感兴趣的:(数据结构,windows,struct,防火墙,delete,开发工具)