Obtener la dirección IP de una interfaz en Linux

¿Cómo puedo obtener la dirección IPv4 de una interfaz en Linux desde el código C?

Por ejemplo, me gustaría obtener la dirección IP (si corresponde) asignada a eth0.

    Prueba esto:

    #include  #include  #include  /* for strncpy */ #include  #include  #include  #include  #include  #include  int main() { int fd; struct ifreq ifr; fd = socket(AF_INET, SOCK_DGRAM, 0); /* I want to get an IPv4 IP address */ ifr.ifr_addr.sa_family = AF_INET; /* I want IP address attached to "eth0" */ strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1); ioctl(fd, SIOCGIFADDR, &ifr); close(fd); /* display result */ printf("%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)); return 0; } 

    La muestra del código se toma de aquí .

    Además del método ioctl (), Filip demostró que puedes usar getifaddrs () . Hay un progtwig de ejemplo en la parte inferior de la página de manual.

    Si está buscando una dirección (IPv4) de la interfaz específica, diga wlan0 , intente con este código que usa getifaddrs () :

     #include  #include  #include  #include  #include  #include  #include  #include  int main(int argc, char *argv[]) { struct ifaddrs *ifaddr, *ifa; int family, s; char host[NI_MAXHOST]; if (getifaddrs(&ifaddr) == -1) { perror("getifaddrs"); exit(EXIT_FAILURE); } for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) continue; s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if((strcmp(ifa->ifa_name,"wlan0")==0)&&(ifa->ifa_addr->sa_family==AF_INET)) { if (s != 0) { printf("getnameinfo() failed: %s\n", gai_strerror(s)); exit(EXIT_FAILURE); } printf("\tInterface : < %s>\n",ifa->ifa_name ); printf("\t Address : < %s>\n", host); } } freeifaddrs(ifaddr); exit(EXIT_SUCCESS); } 

    Puede reemplazar wlan0 por eth0 para ethernet y lo para local loopback.

    La estructura y las explicaciones detalladas de las estructuras de datos utilizadas se pueden encontrar aquí .

    Para saber más sobre la lista enlazada en C, esta página será un buen punto de partida.

    Mis 2 centavos: el mismo código funciona incluso si iOS:

     #include  #include  #include  #include  #include  #include  #include  #include  #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. showIP(); } void showIP() { struct ifaddrs *ifaddr, *ifa; int family, s; char host[NI_MAXHOST]; if (getifaddrs(&ifaddr) == -1) { perror("getifaddrs"); exit(EXIT_FAILURE); } for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) continue; s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if( /*(strcmp(ifa->ifa_name,"wlan0")==0)&&( */ ifa->ifa_addr->sa_family==AF_INET) // ) { if (s != 0) { printf("getnameinfo() failed: %s\n", gai_strerror(s)); exit(EXIT_FAILURE); } printf("\tInterface : < %s>\n",ifa->ifa_name ); printf("\t Address : < %s>\n", host); } } freeifaddrs(ifaddr); } @end 

    Simplemente eliminé la prueba contra wlan0 para ver los datos. ps Puedes eliminar “familia”

    Si no te importa el tamaño binario, puedes usar iproute2 como biblioteca.

    iproute2-as-lib

    Pros:

    • No es necesario escribir el código de la capa de socket.
    • Se puede obtener más o incluso más información sobre las interfaces de red. La misma funcionalidad con las herramientas de iproute2.
    • Interfaz API simple.

    Contras:

    • el tamaño de la biblioteca iproute2-as-lib es grande. ~ 500kb.