Не удается получить MAC-адрес с помощью ioctl в Linux при отключении от Wi-Fi

Я получаю mac-адрес, используя этот метод:

#include <sys/ioctl.h>
#include <net/if.h> 
#include <unistd.h>
#include <netinet/in.h>
#include <string.h>

int main()
{
    ifreq ifr;
    ifconf ifc;
    char buf[1024];
    int success = 0;

    int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
    if (sock == -1) { /* handle error*/ };

    ifc.ifc_len = sizeof(buf);
    ifc.ifc_buf = buf;
    if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) { /* handle error */ }

    ifreq* it = ifc.ifc_req;
    const ifreq* const end = it + (ifc.ifc_len / sizeof(ifreq));

    for (; it != end; ++it) {
        strcpy(ifr.ifr_name, it->ifr_name);
        if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
            if (! (ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback
                if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
                    success = 1;
                    break;
                }
            }
        }
    }

    unsigned char mac_address[6];

    if (success) memcpy(mac_address, ifr.ifr_hwaddr.sa_data, 6);
}

(Взято из Как получить MAC-адрес вашего машина с помощью программы C?)

Однако, когда я отключаюсь от сети Wi-Fi, первый вызов ioctl возвращает пустой список.

Не могли бы вы объяснить такое поведение?


person Butaca    schedule 03.04.2012    source источник
comment
Есть ли причина не использовать вместо этого rtnetlink? Кроме того, SIOCGIFCONF возвращает только те интерфейсы, которые 1) запущены и работают и 2) имеют адрес ipv4.   -  person BatchyX    schedule 04.04.2012
comment
Вы пробовали это решение?   -  person Karl Bielefeldt    schedule 04.04.2012
comment
Спасибо, парни. Я новичок в программировании под линукс. Я читал документацию на kernel.org, но пропустил ту часть, что SIOCGIFCONF возвращает только работающие интерфейсы. Мне нужно получить mac-адрес первого интерфейса, независимо от того, запущен он или нет. Какие флаги следует использовать? Я попробую предложение Карла завтра на работе.   -  person Butaca    schedule 04.04.2012


Ответы (1)


Описанное поведение связано с тем, что SIOCGIFCONF возвращает работающие интерфейсы.

Кредит принадлежит Batchy

person Butaca    schedule 09.04.2012