2010-01-27 7 views
15

Ich versuche, meine lokale (nicht die externe) IP-Adresse mit der Funktion getaddrinfo() zu erhalten, aber ich sah die Beispiele zur Verfügung gestellt here, und sie waren zu komplex für meine Bedürfnisse. Habe auch andere Posts gesehen und die meisten wollten wirklich die externe IP bekommen, nicht die lokale.Erhalten der lokalen IP-Adresse mit getaddrinfo() C-Funktion?

Könnte jemand einen Link zu einem einfachen Beispiel (oder einem einfachen Beispiel) zur Verfügung stellen, wie ich mit dieser Funktion meine eigene lokale IP-Adresse erhalten kann?

Nur um klar zu sein, wenn ich lokal sage, wenn ein Router 192.168.0.1 ist, könnte meine lokale IP-Adresse so etwas wie 192.168.0.x (nur ein Beispiel) sein.

+0

Getaddrinfo gemacht wurde ein haben einheitliche Schnittstelle zwischen ipv4 und ipv6, deshalb sieht es ein wenig komplex aus. (Wenn es die Antwort bekommen, lasse ich Sie später wissen) – Aif

+0

Danke! Ja, es sieht komplex aus und ich möchte nicht gethostbyname() verwenden, weil es veraltet zu sein scheint ... – Goles

+1

Das letzte Beispiel auf dieser Seite ist, wie man das macht ... Warum ist das zu komplex? Verwenden Sie AF_INET, wenn Sie wirklich nur eine IPv4-Adresse haben wollen ... aber tun Sie das nicht, und unterstützen Sie auch IPv6. –

Antwort

32

getaddrinfo() ist nicht für den Erhalt Ihrer lokalen IP-Adresse - es ist für die Suche nach Namen und/oder Dienste zu Socket-Adressen. Zu erhalten Adresse der lokalen IP (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; 
} 
+0

Danke für diesen Proof of Concept, ich denke es ist sehr klar. – Goles

+1

Dies ist die beste Antwort, die ich jemals in dieser Frage gesehen habe. – xmllmx

+0

'getaddrinfo()' kann sicherlich verwendet werden, um lokale IP-Adressen zu erhalten. Siehe http://beej.us/guide/bgnet/output/html/multipage/syscalls.html#getaddrinfo. Es hat auch den Vorteil, viel portabler zu sein - 'getifaddrs()' ist meistens auf Linux beschränkt. – patrickvacek

-1

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

int gethostname(char *hostname, size_t size); 
+0

Nein, der Hostname ist möglicherweise nicht auflösbar. Es ist nicht gut zu versuchen, es zu lösen. Es ist jedoch ein häufiger Programmierfehler, daher garantieren einige Systeme, dass der Hostname durch Zurückgeben von "127.0.1.1" auflösbar ist, so dass kein Fehler auftritt. Daher können Sie sich nicht einmal auf die Rückgabe verlassen, da es möglicherweise nicht einmal eine nützliche Adresse ist. –

Verwandte Themen