Pergunta

Estou tentando obter meu endereço IP local (não o externo) usando a função getaddrinfo (), mas vi os exemplos fornecidos aqui, e eles eram complexos demais para minhas necessidades. Também vi outros posts e a maioria deles realmente queria obter o IP externo, não o local.

Alguém poderia fornecer um link para um exemplo simples (ou um exemplo simples) sobre como obter meu próprio endereço IP local usando esta função?

Só para ficar claro quando digo local, se um roteador for 192.168.0.1 , meu endereço IP local pode ser algo como 192.168.0.x (apenas um exemplo).

Foi útil?

Solução

getaddrinfo() Não é para obter seu endereço IP local - é para procurar nomes e/ou serviços para endereços de soquete. Para obter os endereço IP local, a função que você deseja é getifaddrs() - Aqui está um exemplo 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;
}

Outras dicas

Passe o nome do host depois de usar gethostname(), para gethostbyname()

int gethostname(char *hostname, size_t size);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top