La obtención de la dirección IP local utilizando getaddrinfo función () C?
-
23-09-2019 - |
Pregunta
Estoy tratando de obtener mi (no el externo) dirección IP local utilizando la función getaddrinfo (), pero vi los ejemplos proporcionados aquí , y donde demasiado complejo para mis necesidades. También vimos otros mensajes y la mayoría de ellos realmente querían obtener la IP externa, no con la local.
¿Alguien podría proporcionar un enlace a un ejemplo simple (o un simple ejemplo) acerca de cómo obtener mi propia dirección IP local de utilizar esta función?
Para ser claro cuando digo local, si es un router 192.168.0.1
, mi dirección IP local podría ser algo así como 192.168.0.x
(es un ejemplo).
Solución
getaddrinfo()
no es para obtener su dirección IP local - que es para buscar nombres y / o servicios a 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;
}
Otros consejos
Pase el nombre de host después de usar gethostname()
, a gethostbyname()
int gethostname(char *hostname, size_t size);