Utilice la función getaddrinfo en C

Jinku Hu 12 octubre 2023
  1. Utilice la función getaddrinfo para alojar el nombre de la dirección IP en C
  2. Utilice la función getnameinfo para cambiar la dirección IP al nombre de host en C
Utilice la función getaddrinfo 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,

  1. El primero puede ser el puntero al nombre de host o a la cadena de direcciones con formato IPv4 / IPv6.
  2. El segundo argumento puede ser un nombre de servicio o un número de puerto representado con un entero decimal.
  3. Los siguientes dos argumentos apuntan a estructuras addrinfo. El primero es hints 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 estructuras addrinfo.

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
Autor: 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

Artículo relacionado - C Networking