Pregunta

Estoy tratando de obtener mi (no el externo) dirección IP local utilizando la función getaddrinfo (), pero vi los ejemplos proporcionados aquí , y donde demasiado complejo para mis necesidades. También vimos otros mensajes y la mayoría de ellos realmente querían obtener la IP externa, no con la local.

¿Alguien podría proporcionar un enlace a un ejemplo simple (o un simple ejemplo) acerca de cómo obtener mi propia dirección IP local de utilizar esta función?

Para ser claro cuando digo local, si es un router 192.168.0.1, mi dirección IP local podría ser algo así como 192.168.0.x (es un ejemplo).

¿Fue útil?

Solución

getaddrinfo() no es para obtener su dirección IP local - que es para buscar nombres y / o servicios a direcciones de socket. Para obtener la dirección IP local (es), la función que desea es getifaddrs() - aquí hay un ejemplo mínimo:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <ifaddrs.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    struct ifaddrs *myaddrs, *ifa;
    void *in_addr;
    char buf[64];

    if(getifaddrs(&myaddrs) != 0)
    {
        perror("getifaddrs");
        exit(1);
    }

    for (ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next)
    {
        if (ifa->ifa_addr == NULL)
            continue;
        if (!(ifa->ifa_flags & IFF_UP))
            continue;

        switch (ifa->ifa_addr->sa_family)
        {
            case AF_INET:
            {
                struct sockaddr_in *s4 = (struct sockaddr_in *)ifa->ifa_addr;
                in_addr = &s4->sin_addr;
                break;
            }

            case AF_INET6:
            {
                struct sockaddr_in6 *s6 = (struct sockaddr_in6 *)ifa->ifa_addr;
                in_addr = &s6->sin6_addr;
                break;
            }

            default:
                continue;
        }

        if (!inet_ntop(ifa->ifa_addr->sa_family, in_addr, buf, sizeof(buf)))
        {
            printf("%s: inet_ntop failed!\n", ifa->ifa_name);
        }
        else
        {
            printf("%s: %s\n", ifa->ifa_name, buf);
        }
    }

    freeifaddrs(myaddrs);
    return 0;
}

Otros consejos

Pase el nombre de host después de usar gethostname(), a gethostbyname()

int gethostname(char *hostname, size_t size);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top