Utilisez la fonction getaddrinfo en C

Jinku Hu 12 octobre 2023
  1. Utilisez la fonction getaddrinfo pour Host Name to IP Address in C
  2. Utilisez la fonction getnameinfo pour l’adresse IP vers le nom d’hôte en C
Utilisez la fonction getaddrinfo 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,

  1. Le premier peut être le pointeur vers le nom d’hôte ou la chaîne d’adresse au format IPv4 / IPv6.
  2. Le deuxième argument peut être un nom de service ou un numéro de port représenté par un entier décimal.
  3. Les deux arguments suivants sont des pointeurs vers des structures addrinfo. Le premier est hints 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 structures addrinfo.

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
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Article connexe - C Networking