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?
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
Haben Sie versucht [diese Lösung] (http://stackoverflow.com/a/1780367/389146)? –
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