计算机网络课程设计
——机械工业出版社
第5章:发送ARP数据包
课程设计目的:
ARP协议用于完成IP地址与MAC 地址之间的转换。熟悉ARP协议对于IP数据包的传送过程具有重要意义。本课程设计的主要目的是通过封装与发送ARP帧,了解ARP协议的工作原理与ARP帧的结构。
完整程序代码:
#include
#include
#pragma comment(lib,"wpcap.lib")
#pragma comment(lib,"ws2_32.lib")
typedef struct PhyFrame
{
unsigned char DstMAC[6];
unsigned char SrcMAC[6];
unsigned short FrameType;
}PHYFRAME;
typedef struct ArpFrame
{
unsigned short HardwareType;
unsigned short ProtocolType;
unsigned char MACLen;
unsigned char IPLen;
unsigned short Flag;
unsigned char SrcMAC[6];
unsigned char SrcIP[4];
unsigned char DstMAC[6];
unsigned char DstIP[4];
unsigned char Padding[18];
}ARPFRAME;
typedef struct ArpPacket
{
PHYFRAME phyFrame;
ARPFRAME arpFrame;
}*ARPPACKET;
ArpPacket arpPacket;
int CheckMAC(char *argv,unsigned char *mac_addr)
{
char mac[18];
int i=0,j=0,k=0;
strcpy(mac,argv);
int m=strlen(argv);
for(i=0;i
{
if(mac[i]'-'&&mac[i]'9'&&mac[i]'Z'&&mac[i]'z')
{
cout<
return 0;
}
else
{
if(mac[i]!='-')
j++;
else
{
k++;
if(j>2)
{
cout<
return 0;
}
else
j=0;
if(k>5)
{
cout<
return 0;
}
}
}
}
for(i=0;i<6;i++)
{
while(*(mac+j)=='-')
j++;
if(*(mac+j)>='0'&&*(mac+j)<='9')
mac_addr[i]=(unsigned char)(*(mac+j)-'0');
if(*(mac+j)>='a'&&*(mac+j)<='z')
mac_addr[i]=(unsigned char)(*(mac+j)-'a'+10);
if(*(mac+j)>='A'&&*(mac+j)<='Z')
mac_addr[i]=(unsigned char)(*(mac+j)-'A'+10);
j++;
mac_addr[i]*=16;
if(*(mac+j)>='0'&&*(mac+j)<='9')
mac_addr[i]+=(unsigned char)(*(mac+j)-'0');
if(*(mac+j)>='a'&&*(mac+j)<='z')
mac_addr[i]+=(unsigned char)(*(mac+j)-'a'+10);
if(*(mac+j)>='A'&&*(mac+j)<='Z')
mac_addr[i]+=(unsigned char)(*(mac+j)-'A'+10);
j++;
}
return 1;
}
int CheckIP(char *argv,unsigned char *ip_addr)
{
char ip[16];
i