que estoy usando el siguiente código para recuperar todas las direcciones MAC de los ordenadores actuales:C/C++ de Linux dirección MAC de todas las interfaces
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 { ... }
}
Mediante la ejecución sencilla ifconfig comando shell i puede ver lo, eth0 y wlan0. Me gustaría recuperar direcciones MAC para eth0 y wlan0 por mi código C/C++. Pero solo se devuelve wlan0 - falta eth0 (obtuve ifr_names lo, lo, wlan0). Probablemente porque eth0 no está activo (no hay un cable de Ethernet conectado, se devuelve el cable). ¿Puedo de alguna manera alterar ese comando ioctl (SIOCGIFCONF) para recuperar eth0 también, incluso si está "apagado"?
puedo obtener su dirección HW utilizando directamente
struct ifreq s;
int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
strcpy(s.ifr_name, "eth0");
if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) { ... }
pero lo que si el nombre no sería sino otra cosa eth0 (eth1, em0, ...)? Me gustaría obtenerlos a todos. Gracias por la ayuda.
Gracias, eso es siempre una solución, pero yo prefiero usar un poco de la solución C, analizar los resultados ifconfig puede ser problemático, el formato puede ser diferente con diferentes versiones de Linux, etc. – user1173626