GNU/Linux >> Tutoriales Linux >  >> Linux

Obtener la dirección IP de una interfaz en Linux

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

#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
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 con eth0 para ethernet y lo para bucle invertido local.

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.


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


Prueba esto:

#include <stdio.h>
#include <unistd.h>
#include <string.h> /* for strncpy */

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <arpa/inet.h>

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;
}

El ejemplo de código se toma de aquí.


Linux
  1. Linux:¿la forma portátil de obtener la dirección de origen de la ruta predeterminada?

  2. Python:obtenga la puerta de enlace predeterminada para una interfaz local/dirección IP en Linux

  3. ¿Cómo obtener la cantidad de CPU en Linux usando C?

  4. Linux obteniendo todos los nombres de interfaz de red

  5. Linux/bash:¿Cómo obtener la dirección IPv6 de la interfaz?

Cómo encontrar la dirección IP en Linux

3 formas de configurar una interfaz de red en Linux

Cómo cambiar la dirección IP en Linux

Cómo obtener su dirección IP en Linux

Obtener la dirección IP de los sitios

Obtenga una dirección IP en Linux:descubra las muchas formas