第一次写发包程序,发送ARP数据包。写一些体会。
1.封包之前一定要用sniffer抓包看看,封好之后看看数组内存的值,比对一下。ARP包sniffer需要选Hardware
2.由于计算机内存序列和网络序列不一致,所以需要用htons函数转成网络序列。序列具体的不同,可以看抓包文件。
void BuildArpPacket(CString szEDMac,CString szESMac,CString szPDMac,CString szPDIP,CString szPSMac,CString szPSIP,int nStyle,u_char * p)
{
/*获取数值*/
u_char smac[6]={0};
u_char dmac[6]={0};
char sip[20]={0};
char dip[20]={0};
u_char psmac[6]={0};
u_char pdmac [6]={0};
u_short opCode= ARPOP_REPLY;
memcpy(sip,szPSIP.GetBuffer(szPSIP.GetLength()),20);
memcpy(dip,szPDIP.GetBuffer(szPDIP.GetLength()),20);
u_char *smac_u = smac;
u_char *dmac_u = dmac;
u_char *psmac_u = psmac;
u_char *pdmac_u = pdmac;
str2mac(smac_u,szESMac);
str2mac(dmac_u,szEDMac);
str2mac(psmac_u,szPSMac);
str2mac(pdmac_u,szPDMac);
u_char pshost_u[4]={0};
str2ip(sip,pshost_u);
u_char pdhost_u[4] = {0};
str2ip(dip,pdhost_u);
//info
ETHeader etHeader;
ARPHeader arpHeader;
memcpy(etHeader.shost, smac_u,6);
memcpy(etHeader.dhost, dmac_u,6);
etHeader.type = htons(0x0806); /*eth*/
arpHeader.hrd = htons(0x0001);
arpHeader.eth_type = htons(0x0800);
arpHeader.maclen = 6;
arpHeader.iplen = 4;
arpHeader.opcode = htons(nStyle);
memcpy(arpHeader.smac, psmac_u, 6);
memcpy(arpHeader.saddr, pshost_u, 4);
memcpy(arpHeader.dmac, pdmac_u, 6);
memcpy(arpHeader.daddr, pdhost_u, 4);
memcpy(p, &etHeader, sizeof(etHeader));
memcpy(p+sizeof(etHeader), &arpHeader, sizeof(arpHeader));
}