Frage

Ich versuche, meine lokale (nicht die externe) IP-Adresse mit der getaddrinfo () Funktion zu erhalten, aber ich sah, wie die Beispiele zur Verfügung gestellt hier , und sie für meine Bedürfnisse zu komplex, wo. Wir sahen auch andere Beiträge und die meisten von ihnen wirklich die externe IP bekommen, nicht die lokale wollte.

Könnte jemand einen Link zu einem einfachen Beispiel liefern (oder ein einfaches Beispiel), wie meine eigene lokale IP-Adresse mit dieser Funktion zu erhalten?

Just klar sein, wenn ich vor Ort sagen, wenn ein Router 192.168.0.1 ist, meine lokale IP-Adresse so etwas wie 192.168.0.x sein könnte (nur ein Beispiel).

War es hilfreich?

Lösung

getaddrinfo() ist nicht für die lokale IP-Adresse zu erhalten - es ist für Namen und / oder Dienstleistungen zu Socket-Adressen nachschlagen. So erhalten Sie die lokale IP-Adresse (n), die gewünschte Funktion ist getifaddrs() - hier ein minimales Beispiel:

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

Andere Tipps

Führen Sie die Host-Namen nach gethostname() verwenden, um gethostbyname()

int gethostname(char *hostname, size_t size);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top