我必须获取我的界面的MAC地址,并使用 geadaddrs 的 ifaddr 结构。它工作正常。但是对于我的其余工作,我正在使用 ifreq 结构。所以我需要将地址从第一个结构复制到第二个结构。 我发现ifaddr中的 sockaddr 结构是指针,但与 ifreq 不一样。当我复制 sa_data 数组时,我发现值不同。 这是我的代码:
struct ifreq ifr;
struct ifaddrs *tempifs, *po;
getifaddrs(&tempifs);
for(po = tempifs; po != NULL; po = po->ifa_next)
{
if(!strcasecmp(po->ifa_name,ifr.ifr_name))
{
wpa_printf(MSG_DEBUG, "found it");
if(po->ifa_addr->sa_family == AF_LINK)
{
unsigned char* ptr = (unsigned char *)po->ifa_addr->sa_data + 12;
printf("%s:%d %d %02x:%02x:%02x:%02x:%02x:%02x\n",
(po)->ifa_name,
po->ifa_addr->sa_family,
po->ifa_addr->sa_len,
*ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5));
ifr.ifr_addr.sa_len = po->ifa_addr->sa_len;
ifr.ifr_addr.sa_family = AF_LINK;
strcpy(ifr.ifr_addr.sa_data, po->ifa_addr->sa_data);
unsigned char *ptr1 = (unsigned char *)&ifr.ifr_ifru.ifru_addr.sa_data + 12;
printf("%s:%d %d %02x:%02x:%02x:%02x:%02x:%02x\n",
(ifr).ifr_name,
ifr.ifr_ifru.ifru_addr.sa_family,
ifr.ifr_ifru.ifru_addr.sa_len,
*ptr1, *(ptr1+1), *(ptr1+2), *(ptr1+3), *(ptr1+4), *(ptr1+5));
}
break;
}
}
输出是:
gbeth0:18 56 6c:f0:49:b3:60:1b
gbeth0:18 56 00:00:12:00:00:00
18:sa_family(即AF_LINK) 56:是sa_len
复制一定有问题,但我找不到。 谢谢,
注意 另外,我在FreeBSD上。这就是我不使用的原因: ifr.ifr_hwaddr
答案 0 :(得分:1)
请勿使用strcpy
复制二进制数据,请改用memcpy
。 strcpy
在第一个零字节处停止。