2010-01-27 18 views
15

Estoy tratando de obtener mi dirección IP local (no la externa) usando la función getaddrinfo(), pero vi los ejemplos proporcionados here, y son demasiado complejos para mis necesidades. También vi otras publicaciones y la mayoría de ellas realmente querían obtener la IP externa, no la local.Obteniendo la dirección IP local utilizando la función C de getaddrinfo()?

¿Alguien podría proporcionar un enlace a un ejemplo simple (o un ejemplo simple) sobre cómo obtener mi propia dirección IP local usando esta función?

Para que quede claro cuando digo local, si un enrutador es 192.168.0.1, mi dirección IP local podría ser algo así como 192.168.0.x (solo un ejemplo).

+0

getaddrinfo fue hecho para tener una interfaz uniforme entre ipv4 e ipv6, esta es la razón por la que parece un poco complejo. (Si recibe la respuesta, te lo haré saber más tarde) – Aif

+0

¡Gracias! Sí, parece complejo y no quiero usar gethostbyname() porque parece estar en desuso ... – Goles

+1

El último ejemplo en esa página es cómo hacer esto ... ¿por qué es demasiado complejo? Use AF_INET si realmente quiere solo una dirección IPv4 ... pero no lo haga, haga que sea compatible con IPv6 también. –

Respuesta

32

getaddrinfo() no es para obtener su dirección IP local, es para buscar nombres y/o servicios para las direcciones de socket. Para obtener la dirección IP local (es), la función que desea es getifaddrs() - aquí hay un ejemplo mínimo:

#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

Gracias por esta prueba de concepto, creo que está muy claro. – Goles

+1

Esta es la mejor respuesta que he visto en esta pregunta. – xmllmx

+0

'getaddrinfo()' ciertamente se puede usar para obtener direcciones IP locales. Ver http://beej.us/guide/bgnet/output/html/multipage/syscalls.html#getaddrinfo. También tiene la ventaja de ser mucho más portátil: 'getifaddrs()' se limita principalmente a Linux. – patrickvacek

-1

Pasar el nombre de host después de usar gethostname(), a gethostbyname()

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

No, el nombre de host no puede resolverse. No es bueno intentar resolverlo. Sin embargo, es un error de programación común, por lo que algunos sistemas garantizan que el nombre de host se pueda resolver al devolver "127.0.1.1" para que no haya ningún error. Por lo tanto, ni siquiera puede confiar en la devolución porque tal vez ni siquiera sea una dirección útil. –

Cuestiones relacionadas