Utilisez la fonction getaddrinfo en C
-
Utilisez la fonction
getaddrinfo
pour Host Name to IP Address in C -
Utilisez la fonction
getnameinfo
pour l’adresse IP vers le nom d’hôte en C
Cet article présente plusieurs méthodes d’utilisation de la fonction getaddrinfo
en C.
Utilisez la fonction getaddrinfo
pour Host Name to IP Address in C
getaddrinfo
fait partie des fonctionnalités de programmation réseau UNIX, et il peut convertir les informations d’hôte réseau en adresse IP et inversement. getaddrinfo
est également un appel de fonction compatible POSIX, et il peut effectuer une conversion quels que soient les protocoles sous-jacents.
getaddrinfo
prend quatre arguments,
- Le premier peut être le pointeur vers le nom d’hôte ou la chaîne d’adresse au format IPv4 / IPv6.
- Le deuxième argument peut être un nom de service ou un numéro de port représenté par un entier décimal.
- Les deux arguments suivants sont des pointeurs vers des structures
addrinfo
. Le premier esthints
qui spécifie les exigences pour filtrer les structures de socket récupérées, tandis que le second est le pointeur, où la fonction allouera dynamiquement une liste chaînée de structuresaddrinfo
.
Notez que la structure hints
doit être définie avec des zéros et que ses membres doivent ensuite être affectés. Le membre ai_family
indique la famille d’adresses, par exemple, IPv4 ou IPv6 comme AF_INET et AF_INET6, respectivement. Dans ce cas, nous ne sommes pas intéressés par la conversion de nom de service et spécifions NULL
comme deuxième argument de la fonction. Enfin, nous appelons getnameinfo
pour traduire les structures sockaddr
données en une forme imprimable.
#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);
}
Exemple de commande:
./program localhost
Production:
127.0.0.1
127.0.0.1
127.0.0.1
Utilisez la fonction getnameinfo
pour l’adresse IP vers le nom d’hôte en C
La fonction getnameinfo
est utilisée en conjonction avec getaddrinfo
dans ce cas, et elle récupère les noms d’hôte pour les adresses IP correspondantes. Notez que nous traitons l’entrée utilisateur à partir du premier argument de ligne de commande et la passons comme argument getaddrinfo
pour récupérer les structures socketaddr
. Enfin, chaque structure peut être traduite en chaîne de nom d’hôte. Puisque le getaddrinfo
alloue de la mémoire dynamique pour stocker la liste chaînée dans le quatrième argument, ce pointeur doit être libéré par l’utilisateur avec l’appel de la fonction 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);
}
Exemple de commande:
./program 127.0.0.1
Production:
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