将 ifaddr 的地址复制到 ifreq 结构
copying the address of ifaddr to an ifreq struct
我必须获取接口的 MAC 地址,并且我使用 ifaddr 结构和 getifaddrs。它工作正常。但是对于我的其余工作,我使用 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
不要使用 strcpy
来复制二进制数据,请改用 memcpy
。 strcpy
在第一个零字节处停止。
我必须获取接口的 MAC 地址,并且我使用 ifaddr 结构和 getifaddrs。它工作正常。但是对于我的其余工作,我使用 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
不要使用 strcpy
来复制二进制数据,请改用 memcpy
。 strcpy
在第一个零字节处停止。