używam następujący kod, aby pobrać wszystkie adresy MAC na bieżącym komputerze:C/C++ Linux MAC Address wszystkich interfejsów
ifreq ifr;
ifconf ifc;
char buf[1024];
int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
if (sock == -1) { ... };
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) { ... }
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)) {
if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
unsigned char mac_address[6];
memcpy(mac_address, ifr.ifr_hwaddr.sa_data, 6);
...
}
}
}
else { ... }
}
Uruchamiając proste polecenie powłoki ifconfig widzę lo, eth0 i wlan0. Chciałbym pobrać adresy MAC dla eth0 i wlan0 przez mój kod C/C++. Ale tylko wlan0 jest zwracany - eth0 brakuje (mam ifr_names lo, lo, wlan0). Prawdopodobnie dlatego, że eth0 nie jest aktywny (kabel sieciowy nie jest podłączony, a kabel jest zwrócony). Czy mogę jakoś zmienić to polecenie ioctl (SIOCGIFCONF), aby pobrać eth0, nawet jeśli jest "wyłączone"?
mogę dostać jego adres HW za pomocą bezpośrednio
struct ifreq s;
int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
strcpy(s.ifr_name, "eth0");
if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) { ... }
ale co jeśli nazwa nie byłaby eth0 ale coś innego (eth1, em0, ...)? Chciałbym je wszystkie zdobyć. Dzięki za pomoc.
dzięki, że zawsze jest rozwiązanie, ale wolałbym użyć jakieś rozwiązanie C, analizowania wyników ifconfig może być problematyczne, format może być różny w różnych wersjach Linux, itd – user1173626