¿Cómo puedo usar el PROGRAMA C o C ++ (sin línea de comando) para obtener las direcciones MAC (también tomaré las direcciones IP si son "libres") en mi (pequeña) red local? Es un Busybox Linux incorporado, por lo que necesito una respuesta minimalista que, con suerte, no requiera la portabilidad de alguna biblioteca. No tengo libnet o libpcap. El caché arp parece no contener nunca nada más que el MAC si el servidor DHCP.
Abra /proc/net/arp , luego lea cada línea así:
char line[500]; // Read with fgets(). char ip_address[500]; // Obviously more space than necessary, just illustrating here. int hw_type; int flags; char mac_address[500]; char mask[500]; char device[500]; FILE *fp = xfopen("/proc/net/arp", "r"); fgets(line, sizeof(line), fp); // Skip the first line (column headers). while(fgets(line, sizeof(line), fp)) { // Read the data. sscanf(line, "%s 0x%x 0x%x %s %s %s\n", ip_address, &hw_type, &flags, mac_address, mask, device); // Do stuff with it. } fclose(fp); Esto se tomó directamente de la implementación de arp de BusyBox, en busybox-1_21_0/networking/arp.c del tarball de BusyBox 1.21.0 . Mire la función arp_show() en particular.
Si tienes miedo de C:
El comando arp -a debería darle lo que desea, tanto direcciones MAC como direcciones IP.
Para obtener todas las direcciones MAC en una subred, puede intentar
nmap -n -sP <subnet> arp -a | grep -v incomplete