Question

Je suis en train d'obtenir mon adresse IP locale (pas externe) en utilisant la fonction getaddrinfo (), mais j'ai vu les exemples fournis ici , et ils où trop complexe pour mes besoins. A également vu d'autres postes et la plupart d'entre eux voulaient vraiment obtenir l'adresse IP externe, pas local.

Quelqu'un pourrait-il fournir un lien vers un exemple simple (ou un exemple simple) sur la façon d'obtenir mon adresse IP locale en utilisant cette fonction?

Juste pour être clair quand je dis locale, si un routeur est 192.168.0.1, mon adresse IP locale pourrait être quelque chose comme 192.168.0.x (juste un exemple).

Était-ce utile?

La solution

getaddrinfo() n'est pas pour obtenir votre adresse IP locale - il est pour rechercher des noms et / ou services à des adresses de socket. Pour obtenir l'adresse IP locale (s), la fonction que vous voulez est getifaddrs() - voici un exemple minimal:

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

Autres conseils

Passez le nom d'hôte après avoir utilisé gethostname(), à gethostbyname()

int gethostname(char *hostname, size_t size);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top