2012-04-03 8 views
1

Ich bin eine MAC-Adresse mit dieser Methode bekommen:Kann nicht MAC-Adresse mit ioctl auf Linux bekommen, wenn sie von Wifi getrennt

#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); 
} 

(Entnommen How to get MAC address of your machine using a C program?)

Allerdings, wenn ich aus trennen Das Wifi-Netzwerk, der erste Aufruf von ioctl gibt eine leere Liste zurück.

Können Sie dieses Verhalten erklären?

+0

Gibt es Gründe, nicht statt mit rtnetlink? Außerdem gibt SIOCGIFCONF nur Schnittstellen zurück, die 1) laufen und 2) eine ipv4-Adresse haben. – BatchyX

+0

Haben Sie versucht [diese Lösung] (http://stackoverflow.com/a/1780367/389146)? –

+0

Danke Jungs. Ich bin neu in der Linux-Programmierung. Ich habe die Dokumentation von kernel.org gelesen, aber ich habe den Teil vermisst, den SIOCGIFCONF nur für das Ausführen von Schnittstellen bereitstellt. Ich muss eine MAC-Adresse der ersten Schnittstelle abrufen, unabhängig davon, ob sie ausgeführt wird oder nicht. Welche Flaggen soll ich verwenden? Ich werde Karl Vorschlag morgen bei der Arbeit versuchen. – Butaca

Antwort

1

Das beschriebene Verhalten ist auf die Tatsache zurückzuführen, dass SIOCGIFCONF funktionsfähige Schnittstellen zurückgibt.

Kredit geht an Batchy