2015-10-30 39 views
0

我有一种新的原始套接字,我试图按照this教程。 我可以看到用wireshark传输的数据包很棒。通过原始套接字发送源MAC和IP

但是,该教程中的源mac和源ip缺失,并解释了herehere

的问题是,当我尝试源MAC复制到已知的结构:

ioctl(fd,SIOCGIFINDEX,&ifr) // fd and ifr already defined 
ioctl(fd,SIOCGIFHWADDR,&ifr) 

const unsigned char* mac=(unsigned char*)ifr.ifr_hwaddr.sa_data; 

printf("my MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n", // prints my mac- works fine 
    mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); 

memcpy(&req.arp_sha, mac, sizeof(req.arp_sha)); // req is already defined 

当我调试代码,mac包含了实际MAC地址和req.arp_sha含有别的东西。

我也试过这种方式复制:

req.arp_sha[0] = mac[0]; 
req.arp_sha[1] = mac[1]; 

编辑 在Mac IM期待是:08:00:27:E7:56:0B 我得到的MAC是:00:00:0a:00:02:0f

当我与IP相同地址,它工作得很好,我可以在wireshark上看到。

这是IP代码:

ioctl(fd,SIOCGIFADDR,&ifr); 

struct sockaddr_in* ipaddr = (struct sockaddr_in*)&ifr.ifr_addr; 
const char * myIp = inet_ntoa(ipaddr->sin_addr); 
printf("my IP address: %s\n", myIp); 

memcpy(&req.arp_spa,&ipaddr->sin_addr,sizeof(req.arp_spa)); 

我不明白,如果IM在这里做得不对。我会很乐意提供指导。

谢谢。

+0

你期望什么值?你认为哪些值? – Downvoter

+0

我编辑了我的问题..谢谢 – user1673206

+0

不知何故,你的代码是复制一个IP地址到MAC地址插槽,特别是10.0.2.15。你能发布给你麻烦的完整代码片段吗? –

回答

1

需要这种类型吗?

struct ether_arp { 
    struct arphdr ea_hdr;   /* fixed-size header */ 
    u_int8_t arp_sha[ETHER_ADDR_LEN]; /* sender hardware address */ 
    u_int8_t arp_spa[4];   /* sender protocol address */ 
    u_int8_t arp_tha[ETHER_ADDR_LEN]; /* target hardware address */ 
    u_int8_t arp_tpa[4];   /* target protocol address */ 
}; 

您没有显示整个代码,是吗?

在你说的第一个代码段不起作用,你在printf后立即调用memcpy吗?唯一不可行的可能是mac是一个指向ifr.ifr_hwaddr.sa_data的指针。也许,当你调用

memcpy(&req.arp_sha, mac, sizeof(req.arp_sha)); 

尝试定义MAC作为数组和内容从ifr.ifr_hwaddr.sa_data到Mac复制sa_data的内容已被覆盖。

在第二个片段中,它应该不会很好,即使您说它有效。这是不正常:

memcpy(&req.arp_spa,&ipaddr->sin_addr,sizeof(req.arp_spa)); 

sin_addr是一个无符号长,这是小端而req.arp_spa应该是大端。你确定它在wireshark中看起来正确吗?你能打印吗?

+0

实际上在这种情况下,IP地址的'memcpy'是正确的(至少根据示例代码)。 SIOCGIFADDR以网络字节顺序返回IP地址。 –

+0

嗨,你是对的,变量'ifr.ifr_hwaddr.sa_data'被覆盖。我为if和mac地址使用了'ifr'变量。我改变了'memcpy'的顺序,它工作正常。谢谢! – user1673206

+0

@userd,如果它是正确的,你能标记响应吗? – rodolk