2016-09-12 10 views
7

Die folgende Funktion bestimmt, ob eine gegebene Zeichenfolge ein gültiger Netzwerkgerätename ist.ifreqs ifr_names sind falsch?


int isValidNDevice(char *name) { 

    char data[4096]; 
    struct ifconf ifc; 
    struct ifreq *ifr; 
    int sk; 
    int nIntfcs; 

    sk = socket(AF_INET, SOCK_DGRAM, 0); 
    if(sk < 0) 
    { 
     perror("socket"); 
     return 0; 
    } 

    ifc.ifc_len = sizeof(data); 
    ifc.ifc_buf = (caddr_t)data; 
    if(ioctl(sk, SIOCGIFCONF, &ifc) < 0) 
    { 
     perror("ioctl(SIOCGIFCONF)"); 
     return 0; 
    } 

    ifr = (struct ifreq*)data; 
    nIntfcs = ifc.ifc_len/sizeof(struct ifreq); 
    for(int i=0; i < nIntfcs; i++) 
    { 
     safe_printf("%s\n", (&ifr[i])->ifr_name); 
     if (!strcmp((&ifr[i])->ifr_name, name)) { 
      return 1; 
     } 
    } 

    return 0; 
} 

Wenn ich diese Funktion zu starten, erhalte ich die folgende Ausgabe.


lo0

stf0

2> S

en1j


Dieser Code funktionierte vor ein paar Monaten gut. Was hat sich verändert? Mache ich etwas falsch?

OS: OSX El Capitan

+0

Ah, also ist es Mac OS. Weil für Linux dein Code korrekt ist, aber Macs anders sind, hast du [diesen Code] gesehen (https://gist.github.com/OrangeTide/909204) (Zeilen 57-63)? Obwohl es vielleicht einfacher ist, 'getifaddrs()' oder sogar 'if_nameindex()' zu verwenden (nicht sicher, dass das letzte unter Mac OS unterstützt wird). –

+0

Können Sie ein minimales aber vollständiges Programm einschließen, das Ihr Problem kompiliert und ausführt und zeigt? Sie haben eine viel bessere Chance, Hilfe zu bekommen. Siehe auch http://stackoverflow.com/help/mcve – sigjuice

+3

nIntfcs = ifc.ifc_len/sizeof (struct ifreq) ist unter OS X nicht gültig, da die zurückgegebenen ifreqs nicht alle die gleiche Größe wie Linux haben. Ein Hinweis auf Apples [ifconfig] (https://opensource.apple.com/source/network_cmds/network_cmds-306/ifconfig.tproj/ifconfig.c) Code könnte helfen. – sigjuice

Antwort

1

Die Anordnung von Strukturen, die durch die SIOCGIFCONF IOCTL zurückgekehrt sind nicht von gleicher Größe in OSX. Sie werden ein Feld ifr->ifr_addr.sa_len haben, das für jede Struktur unterschiedlich sein wird

Modifizierte Funktion, die sich darum kümmert. Hoffe es hilft:

int isValidNDevice(char *name) { 

    char data[4096]; 
    struct ifconf ifc; 
    struct ifreq *ifr; 
    int sk,length; 

    sk = socket(AF_INET, SOCK_DGRAM, 0); 
    if(sk < 0) 
    { 
     perror("socket"); 
     return 0; 
    } 

    ifc.ifc_len = sizeof(data); 
    ifc.ifc_buf = (caddr_t)data; 
    if(ioctl(sk, SIOCGIFCONF, &ifc) < 0) 
    { 
     perror("ioctl(SIOCGIFCONF)"); 
     return 0; 
    } 

    ifr = (struct ifreq*)data; 
    for(int i=0;i<ifc.ifc_len;) 
    { 
     length=IFNAMSIZ + ifr->ifr_addr.sa_len; 
     printf("%s\n", ifr->ifr_name); 
     if (!strcmp(ifr->ifr_name,name)) { 
      printf("Interface Found!\n"); 
      return 1; 
     } 
     ifr=(struct ifr*)((char*)ifr+length); 
     i+=length; 
    } 

    return 0; 
} 
+0

Danke für die Antwort! Ich würde trotzdem gerne wissen, was sich geändert hat. Mein Postcode funktionierte vor ein paar Monaten gut. – Roecrew

Verwandte Themen