Domanda

Sto cercando di ottenere la mia (non l'esterno) indirizzo IP locale utilizzando la funzione getaddrinfo (), ma ho visto gli esempi forniti qui , e dove troppo complessa per le mie esigenze. Ha visto anche altri posti e la maggior parte di loro realmente voluto ottenere l'IP esterno, non quella locale.

Qualcuno potrebbe fornire un link ad un semplice esempio (o un semplice esempio) su come ottenere il mio indirizzo IP locale di utilizzare questa funzione?

Giusto per essere chiari quando dico locale, se un router è 192.168.0.1, il mio indirizzo IP locale potrebbe essere qualcosa di simile 192.168.0.x (solo un esempio).

È stato utile?

Soluzione

getaddrinfo() non è per ottenere il vostro indirizzo IP locale - è per la ricerca di nomi e / o servizi a indirizzi socket. Per ottenere l'indirizzo IP locale (es), la funzione che si desidera è getifaddrs() - qui c'è un esempio minimo:

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

Altri suggerimenti

Far passare il nome host dopo aver utilizzato gethostname(), a gethostbyname()

int gethostname(char *hostname, size_t size);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top