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
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). –
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
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