Utilice la función getaddrinfo en C
-
Utilice la función
getaddrinfo
para alojar el nombre de la dirección IP en C -
Utilice la función
getnameinfo
para cambiar la dirección IP al nombre de host en C
Este artículo demostrará varios métodos sobre cómo utilizar la función getaddrinfo
en C.
Utilice la función getaddrinfo
para alojar el nombre de la dirección IP en C
getaddrinfo
es parte de las funciones de programación de redes de UNIX y puede convertir la información del host de la red a la dirección IP y viceversa. getaddrinfo
también es una llamada de función compatible con POSIX y puede realizar conversiones independientemente de los protocolos subyacentes.
getaddrinfo
toma cuatro argumentos,
- El primero puede ser el puntero al nombre de host o a la cadena de direcciones con formato IPv4 / IPv6.
- El segundo argumento puede ser un nombre de servicio o un número de puerto representado con un entero decimal.
- Los siguientes dos argumentos apuntan a estructuras
addrinfo
. El primero eshints
que especifica los requisitos para filtrar las estructuras de socket recuperadas, mientras que el segundo es el puntero, donde la función asignará dinámicamente una lista enlazada de estructurasaddrinfo
.
Tenga en cuenta que, la estructura de hints
debe establecerse con ceros y luego deben asignarse sus miembros. El miembro ai_family
indica la familia de direcciones, por ejemplo, IPv4 o IPv6 como AF_INET y AF_INET6, respectivamente. En este caso, no nos interesa la conversión del nombre del servicio y especificamos NULL
como segundo argumento de la función. Finalmente, llamamos a getnameinfo
para traducir las estructuras sockaddr
dadas a la forma imprimible.
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
int main(int argc, char const *argv[]) {
struct addrinfo hints;
struct addrinfo *res, *tmp;
char host[256];
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_INET;
if (argc != 2) {
fprintf(stderr, "%s string\n", argv[0]);
exit(EXIT_FAILURE);
}
int ret = getaddrinfo(argv[1], NULL, &hints, &res);
if (ret != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret));
exit(EXIT_FAILURE);
}
for (tmp = res; tmp != NULL; tmp = tmp->ai_next) {
getnameinfo(tmp->ai_addr, tmp->ai_addrlen, host, sizeof(host), NULL, 0,
NI_NUMERICHOST);
puts(host);
}
freeaddrinfo(res);
exit(EXIT_SUCCESS);
}
Comando de muestra:
./program localhost
Producción :
127.0.0.1
127.0.0.1
127.0.0.1
Utilice la función getnameinfo
para cambiar la dirección IP al nombre de host en C
La función getnameinfo
se utiliza junto con getaddrinfo
en este caso, y recupera los nombres de host para las direcciones IP correspondientes. Observe que procesamos la entrada del usuario desde el primer argumento de la línea de comandos y la pasamos como argumento getaddrinfo
para recuperar las estructuras socketaddr
. Finalmente, cada estructura se puede traducir a la cadena de nombre de host. Dado que getaddrinfo
asigna memoria dinámica para almacenar la lista enlazada en el cuarto argumento, este puntero debe ser liberado por el usuario con la llamada a la función freeaddrinfo
.
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
int main(int argc, char const *argv[]) {
struct addrinfo hints;
struct addrinfo *res, *tmp;
char host[256];
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_INET;
if (argc != 2) {
fprintf(stderr, "%s string\n", argv[0]);
exit(EXIT_FAILURE);
}
int ret = getaddrinfo(argv[1], NULL, &hints, &res);
if (ret != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret));
exit(EXIT_FAILURE);
}
for (tmp = res; tmp != NULL; tmp = tmp->ai_next) {
getnameinfo(tmp->ai_addr, tmp->ai_addrlen, host, sizeof(host), NULL, 0, 0);
}
freeaddrinfo(res);
exit(EXIT_SUCCESS);
}
Comando de muestra:
./program 127.0.0.1
Producción :
localhost
localhost
localhost
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook