Articulo de referencia

obtenerdirinfo

En la programación en C , las funciones getaddrinfo() convierten nombres de dominio , nombres de host y direcciones IP getnameinfo() entre representaciones de texto legibles por...

En la programación en C , las funcionesgetaddrinfo() convierten nombres de dominio , nombres de host y direcciones IPgetnameinfo() entre representaciones de texto legibles por humanos y formatos binarios estructurados para la API de red del sistema operativo . Ambas funciones están contenidas en la interfaz de programación de aplicaciones (API) estándar POSIX . [ 1 ]

Las funciones `getaddrinfo` y `getnameinfo` son inversas entre sí. Son independientes del protocolo de red y admiten tanto IPv4 como IPv6 . Se trata de la interfaz recomendada para la resolución de nombres en la creación de aplicaciones independientes del protocolo y para la migración de código IPv4 heredado a la Internet IPv6.

Internamente, las funciones pueden utilizar diversos métodos de resolución, no limitados al Sistema de Nombres de Dominio (DNS). El conmutador de servicio de nombres se utiliza comúnmente en sistemas tipo Unix y afecta a la mayoría de las implementaciones de este par, al igual que sucedió con sus predecesores de la era de los sockets BSD . [ 2 ]

información de dirección

La estructura de datos C utilizada para representar los resultados de las consultas de información de direcciones para su uso en la API de red podría definirse de la siguiente manera, posiblemente con miembros en otro orden o miembros adicionales: [ 3 ] [ nota 1 ]

struct addrinfo { int ai_flags ; int ai_family ; int ai_socktype ; int ai_protocol ; socklen_t ai_addrlen ; struct sockaddr * ai_addr ; char * ai_canonname ; struct addrinfo * ai_next ; };

La estructura contiene un miembro ai_familyy otro miembro ai_addrque apunta a un struct sockaddrobjeto con su propio sa_familycampo. Estos se establecen con el mismo valor cuando la estructura se crea con una función getaddrinfo()en algunas implementaciones.

obtenerdirinfo

getaddrinfo()Convierte cadenas de texto legibles por humanos que representan nombres de host o direcciones IP en una lista de estructuras struct addrinfo. El prototipo de la función es: [ 1 ]

int getaddrinfo ( const char * restrict hostname , const char * restrict service , const struct addrinfo * restrict hints , struct addrinfo ** restrict res );
nombre de host
puede ser un nombre de dominio, como " example.com ", una cadena de dirección, como " 127.0.0.1 ", o NULL, en cuyo caso se asigna la dirección 0.0.0.0 o 127.0.0.1 dependiendo de las banderas de sugerencias.
servicio
Puede ser un número de puerto pasado como cadena, como "80" , o un nombre de servicio, por ejemplo "echo" . En este último caso, una implementación típica utiliza para consultar el archivo /etc/services para resolver el servicio a un número de puerto.getservbyname()
pistas
puede ser NULLuna addrinfoestructura con el tipo de servicio solicitado.
res
es un puntero que se asignará para apuntar a una nueva lista enlazada de estructuras asignada dinámicamente con la información solicitada después de la finalización exitosa de la función, que se liberará con . [ 5 ]addrinfofreeaddrinfo()

La función devuelve 0 si tiene éxito y un valor de error distinto de cero si falla, [ 1 ] que se puede asignar a una cadena legible para humanos usando gai_strerror()[ 6 ].

Las implementaciones varían según la plataforma, pero a menudo la función busca los nombres de host en el DNS si no los encuentra, y busca los servicios en una base de datos de servicios conocida . El conjunto exacto de fuentes consultadas para la resolución de nombres de host y servicios suele estar controlado por la configuración del conmutador de servicio de nombres del sistema .

freeaddrinfo

La función freeaddrinfo()libera la memoria asignada por la función getaddrinfo(). Dada una lista enlazada de struct addrinfoobjetos que comienza en ai , devuelta por , libera cada objeto en esa lista.getaddrinfo(..., &ai)freeaddrinfo(ai)struct addrinfo

void freeaddrinfo ( struct addrinfo * ai );

obtenernombreinfo

La función getnameinfo()convierte la representación binaria interna de una dirección IP, en forma de puntero, en struct sockaddrcadenas de texto que constan del nombre de host o, si la dirección no se puede resolver en un nombre, una representación textual de la dirección IP, así como el nombre o número del puerto de servicio. El prototipo de la función se especifica de la siguiente manera:

int getnameinfo ( const struct sockaddr * restrict sa , socklen_t salen , char * restrict host , socklen_t hostlen , char * restrict service , socklen_t servicelen , int flags );

Ejemplo

El siguiente ejemplo utiliza un algoritmo getaddrinfo()para resolver el nombre de dominio www.example.com y obtener su lista de direcciones. A continuación, se consulta cada resultado para obtener el nombre canónico de la dirección. En general, esto produce el nombre de host original , a menos que la dirección tenga varios nombres, en cuyo caso se devuelve el nombre canónico . En este ejemplo, el nombre de dominio se imprime tres veces, una por cada uno de los tres resultados obtenidos.getnameinfo()

#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h>#include <netdb.h> #include <netinet/in.h> #include <sys/socket.h>#ifndef NI_MAXHOST #define NI_MAXHOST 1025 #endifint main ( void ) { const char query_host [] = "www.example.com" ; struct addrinfo * result ;struct addrinfo hints = { . ai_family = AF_UNSPEC , . ai_socktype = SOCK_STREAM };// Resuelve el nombre de dominio en una lista de direcciones int gai_rc = getaddrinfo ( query_host , NULL , & hints , & result ); switch ( gai_rc ) { case 0 : break ; case EAI_SYSTEM : fprintf ( stderr , "Error al resolver la dirección del servidor '%s': error del sistema %s \n " , query_host , strerror ( errno )); return EXIT_FAILURE ; default : fprintf ( stderr , "Error al resolver la dirección del servidor '%s': %s \n " , query_host , gai_strerror ( gai_rc )); return EXIT_FAILURE ; }// Realizar búsqueda DNS inversa para cada dirección resuelta para ( const struct addrinfo * ai = result ; ai != NULL ; ai = ai -> ai_next ) { char hostname [ NI_MAXHOST ]; char addr [ NI_MAXHOST ];int gni_rc = getnameinfo ( ai- > ai_addr , ai- > ai_addrlen , addr , sizeof ( addr ), NULL , 0 , NI_NUMERICHOST ); if ( gni_rc != 0 ) { fprintf ( stderr , "Error al formatear la dirección: %s \n " , gai_strerror ( gni_rc )); continue ; }gni_rc = getnameinfo ( ai- > ai_addr , ai- > ai_addrlen , hostname , sizeof ( hostname ), NULL , 0 , 0 ); switch ( gni_rc ) { case 0 : printf ( "Nombre de host para %s: %s \n " , addr , hostname ); break ; case EAI_SYSTEM : fprintf ( stderr , "Error en la búsqueda DNS inversa para %s: error del sistema %s \n " , addr , strerror ( errno )); break ; default : fprintf ( stderr , "Error en la búsqueda DNS inversa para %s: %s \n " , addr , gai_strerror ( gni_rc )); } }freeaddrinfo ( resultado ); return 0 ; }

Véase también

Notas

  1. En algunos sistemas más antiguos, el tipoai_addrlenessize_ten lugar desocklen_t. La mayoría de las funciones de socket, comoaccept()ygetpeername(), requieren que el parámetro tenga el tiposocklen_t *y los programadores a menudo pasan la dirección alai_addrlenelemento de lasistema Solaris 9addrinfo de 64 bitses de 8 bytes yes de 4 bytes, entonces pueden producirse errores en tiempo de ejecución. [ 4 ]size_tsocklen_t

Referencias

  1. 1 2 3 "freeaddrinfo, getaddrinfo — obtener información de la dirección" . The Open Group Base Specifications Issue 8 (POSIX.1-2024  ed.). The Open Group . Archivado del original el 14 de agosto de 2025. Recuperado el 7 de diciembre de 2025 .
  2. "nss - páginas man sección 5: Formatos de archivo" . docs.oracle.com .
  3. "netdb.h — definiciones para operaciones de bases de datos de red" . The Open Group Base Specifications Issue 8, IEEE Std. 1003.1-2024 ( ed. POSIX.1-2024). The Open Group . Archivado del original el 16 de junio de 2025. Consultado el 7 de diciembre de 2025 . 
  4. "páginas man Sección 3: Funciones de la biblioteca de redes, getaddrinfo(3SOCKET)" . Colección de manuales de referencia de Solaris 9 12/02 . Sun Microsystems . Diciembre de 2002. Archivado del original el 7 de diciembre de 2025. Consultado el 7 de diciembre de 2025 .
  5. Stevens R., Fenner, Rudoff [2003] UNIX® Network Programming Volumen 1, Tercera edición: La API de redes Sockets. Editorial: Addison-Wesley Professional. Fecha de publicación: 14 de noviembre de 2003, pág. 256
  6. "gai_strerror — descripción del error de información de dirección y nombre" . The Open Group Base Specifications Issue 8, IEEE Std. 1003.1-2024 ( ed. POSIX.1-2024). The Open Group . Archivado del original el 19 de mayo de 2025. Recuperado el 7 de diciembre de 2025 . 
  • Especificaciones de freeaddrinfo y getaddrinfo en POSIX.1-2024 . Especificaciones base de The Open Group, número 8, edición de 2024.
  • RFC 3493, Extensiones básicas de interfaz de sockets para IPv6