将 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 来复制二进制数据,请改用 memcpystrcpy 在第一个零字节处停止。