2012-01-27 14 views
7

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.

Respuesta

9

Debe dejar de usar las herramientas de red y la interfaz arcaica ioctl, y comenzar a usar las interfaces modernas de Netlink/sysfs. No tiene menos de 5 posibilidades:

  • escribir su propio código Netlink-interfaz
  • su propio código NL, en combinación utilizando libmnl (-> ver rtnl-link-volcado en Examples
  • o utilizar bibliotecas autónomas como resultado de texto libnl3
  • de análisis de ip -o link (-o es conseguir la producción destinada a análisis de texto, a diferencia de ifconfig)
  • o utilizar sysfs y justo lo bien en /sys/class/net/eth0/address
0

Quizás no sea tan elegante, pero podría capturar & analizar los resultados de ifconfig, ya que parece que tiene justo lo que está buscando.

+0

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

1

se puede encontrar una solución a este problema: Get mac address given a specific interface

Puede omita la parte específica de la interfaz.

+0

Gracias, pero estoy no estoy seguro de entender lo que quieres decir. En el ejemplo del código, todo se trata de solicitar parámetros de la interfaz con el nombre argv [1], que puede ser, por ejemplo, eth0 como en mi segundo fragmento de código. Esta bien. Pero necesito enumerar todas las interfaces. Al omitir la parte "específica" como sugiere, ¿qué permanecerá? Necesito obtener una lista de interfaces que voy a pedir detalles (MAC), ¿es correcto? Por lo que yo entiendo, eso es lo que hago al llamar a SIOCGIFCONF. Pero eth0 no está en la lista. – user1173626

+0

¿Qué le parece combinar estas dos respuestas: analizar los resultados de ifconfig JUST para los nombres (creo que sería bastante independiente de la plataforma) y usar este enfoque para buscar la dirección MAC para cada nombre que encuentre. –

+0

O tome la fuente de ifconfig y vea cómo encuentra estos nombres. –

Cuestiones relacionadas