2010-01-27 9 views
15

J'essaie d'obtenir mon adresse IP locale (pas l'externe) en utilisant la fonction getaddrinfo(), mais j'ai vu les exemples fournis here, et ils étaient trop complexes pour mes besoins. Ont également vu d'autres postes et la plupart d'entre eux voulaient vraiment obtenir l'IP externe, pas la locale.Obtention d'une adresse IP locale à l'aide de la fonction getaddrinfo() C?

Quelqu'un pourrait-il fournir un lien vers un exemple simple (ou un exemple simple) sur la façon d'obtenir ma propre adresse IP locale en utilisant cette fonction? Pour être clair quand je dis local, si un routeur est 192.168.0.1, mon adresse IP locale pourrait être quelque chose comme 192.168.0.x (juste un exemple).

+0

getaddrinfo a été fait d'avoir un interface uniforme entre ipv4 et ipv6, c'est pourquoi il semble un peu complexe. (Si vous obtenez la réponse, je vous le ferai savoir plus tard) – Aif

+0

Merci! , oui, il semble complexe et je ne veux pas utiliser gethostbyname() car il semble être obsolète ... – Goles

+1

Le dernier exemple sur cette page est comment faire ceci ... pourquoi est-ce trop complexe? Utilisez AF_INET si vous voulez vraiment seulement une adresse IPv4 ... mais ne le faites pas, faites-le aussi supporter IPv6. –

Répondre

32

getaddrinfo() n'est pas d'obtenir votre adresse IP locale - c'est pour rechercher des noms et/ou des services aux 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; 
} 
+0

Merci pour cette preuve de concept, je pense que c'est très clair. – Goles

+1

Ceci est la meilleure réponse que j'ai jamais vu sur cette question. – xmllmx

+0

'getaddrinfo()' peut certainement être utilisé pour obtenir des adresses IP locales. Voir http://beej.us/guide/bgnet/output/html/multipage/syscalls.html#getaddrinfo. Il a aussi l'avantage d'être beaucoup plus portable - 'getifaddrs()' est principalement limité à Linux. – patrickvacek

-1

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

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

Non, le nom d'hôte peut ne pas être résolu. Ce n'est pas bon d'essayer de le résoudre. C'est une erreur de programmation courante, donc certains systèmes garantissent que le nom d'hôte est résolvable en retournant "127.0.1.1" juste pour qu'il n'y ait pas d'erreur. Par conséquent, vous ne pouvez même pas compter sur le retour, car il pourrait même ne pas être une adresse utile. –