将ifaddr的地址复制到ifreq结构

时间:2016-03-01 09:22:48

标签: c freebsd mac-address

我必须获取我的界面的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

1 个答案:

答案 0 :(得分:1)

请勿使用strcpy复制二进制数据,请改用memcpystrcpy在第一个零字节处停止。