Utilisez la fonction getaddrinfo en C
-
Utilisez la fonction
getaddrinfopour Host Name to IP Address in C -
Utilisez la fonction
getnameinfopour 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 esthintsqui 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