I use the following code to extract all the MAC addresses for the current computer:
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 { ... } }
By running a simple ifconfig shell command, I can see lo, eth0 and wlan0. I would like to get the MAC addresses for eth0 and wlan0 using my C / C ++ code. But only wlan0 is returned - eth0 is missing (I got ifr_names lo, lo, wlan0). Probably because eth0 is inactive (Ethernet cable not connected, cable is returning). Can I somehow modify this ioctl (SIOCGIFCONF) command to retrieve eth0, even if it is disabled?
I can get his HW address using directly
struct ifreq s; int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); strcpy(s.ifr_name, "eth0"); if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) { ... }
but what if the name is not eth0, but something else (eth1, em0, ...)? I would like to get all of them. Thanks for the help.
user1173626
source share