getaddrinfo

Ir a: navegación, búsqueda de
El título correcto de este artículo es getaddrinfo/getnameinfo. Aparece incorrectamente aquí porque restricciones técnicas.

El getaddrinfo() y getnameinfo() funciones forman parte de la POSIX estándar interfaz de programación de aplicaciones (API) para convertir sistema de nombres de dominio (DNS) nombres de host y las direcciones IP entre sus representaciones de texto legible y estructurados formatos binarios para el Sistema operativos networking API.

getaddrinfo() y getnameinfo() son funciones inversas entre sí.

Este conjunto de funciones totalmente es el protocolo de red independiente y soportes IPv4 y IPv6. Es la interfaz recomendada para resolución de nombres en la construcción de protocolo de aplicaciones independientes y para realizar la transición Código heredado de IPv4 a IPv6 Internet.

Internamente, la función necesita realizar algún tipo de DNS búsqueda llamando a otros, como la función del nivel inferior gethostbyname(). El archivo resolv.conf determina el comportamiento de esta búsqueda y puede ser modificada por el usuario del sistema.

Contenido

  • 1 struct addrinfo
  • 2 getaddrinfo()
  • 3 getnameinfo()
  • 4 freeaddrinfo()
  • 5 Ejemplo
  • 6 Véase también
  • 7 Enlaces externos
  • 8 Referencias

struct addrinfo

El C estructura de datos para representar direcciones y nombres de host dentro de la red API es la siguiente:

struct addrinfo {
    int ai_flags;
    int ai_family;
    int ai_socktype;
    int ai_protocol;
    size_t ai_addrlen;
    struct sockaddr *ai_addr;
    Char    *ai_canonname;     / * nombre canónico * /
    struct addrinfo *ai_next; / * Esta estructura puede formar una lista vinculada * /
};

En sistemas operativos recientes se ha cambiado el tipo de ai_addrlen de size_t a socklen_t. La mayoría toma funciones, tales como aceptar y getpeername, requiere un parámetro socklen_t * y programadores a menudo pasan la dirección al elemento ai_addrlen de la estructura addrinfo. Si los tipos son incompatibles, por ejemplo, en un sistema de Solaris 9 de 64-bit bigEndian donde size_t es 8 bytes y socklen_t es de 4 bytes, entonces pueden provocar errores de tiempo de ejecución.

Es interesante notar que la estructura contiene un ai_family y un sockaddr estructura con su propio sa_family campo. Estos se establecen en el mismo valor cuando se crea la estructura con la getaddrinfo() función en algunas implementaciones.

getaddrinfo()

getaddrinfo() convierte cadenas de texto legible que representan nombres de host o Direcciones IP en un asigna de forma dinámica lista enlazada de struct addrinfo estructuras. Los prototipos de función para estas funciones se especifican como sigue:

#include < sys/types.h >
#include < sys/socket.h >
#include < netdb.h >
 
int getaddrinfo(Const Char *nombre de host,
                Const Char *servicio,
                Const struct addrinfo *Consejos,
                struct addrinfo **res);
  • nombre de host puede ser o un nombre de dominio como "ejemplo.com", una cadena de dirección como "127.0.0.1" o NULL en cual caso la dirección 0.0.0.0 o 127.0.0.1 se asigna dependiendo de las banderas de consejos.
  • servicio puede ser un número de Puerto pasado como cadena como "80" o un nombre de servicio como "eco" (que se debe asignar al puerto 7 por defecto). En este último caso, gethostbyname() se utiliza para consulta / etc/services.
  • Consejos puede ser cualquiera NULL o un addrinfo estructura con el tipo de servicio estamos interesados (ej. un enchufe pueden estar disponibles para TCP y UDP tan sólo podemos afirmar nuestro interés en el anterior)
  • res es un puntero que se apuntará a un nuevo addrinfo estructura de la información solicitada a la terminación exitosa de la función.

La función devuelve 0 si éxito y negativo si se produce un error en el camino.[1]

Aunque las implementaciones varían entre plataformas, la función primero probar y obtener un número de Puerto generalmente por su ramificación en servicio. Si el valor de cadena es un número, lo será convertir a un entero usando htons(). Si es un nombre de servicio como www buscará el servicio llamando al getservbyname(), usando el protocolo derivado Sugerencias -> ai_socktype como segundo parámetro para esa función. Entonces, If un nombre de host se da (not NULL), también llamará gethostbyname() para hacer una resolución de nombre a IP lo contrario le asignará una dirección 0.0.0.0 si el Sugerencias -> ai_flags se establece en AI_PASSIVE y lo contrario 127.0.0.1. Luego llamará malloc_ai en una de estas condiciones y pasar el puerto obtenido al principio para asignar un addrinfo estructura de lleno con el apropiado sockaddr_in. Finalmente se desreferenciar el ** res parámetro para hacerla señalar un recién asignado addrinfo estructura.[2] En algunas implementaciones (como la versión de Unix para Mac OS), el Sugerencias -> ai_protocol anulará la Sugerencias -> ai_socktype valor, mientras que en otros es lo contrario, así que ambos necesitan ser definido con valores equivalentes para el código para ser multiplataforma.

getnameinfo()

getnameinfo() convierte la representación binaria interna de una dirección IP en forma de un struct sockaddr puntero en las cadenas de texto que consiste en el nombre de host o, si la dirección no puede resolverse en un nombre, una representación textual de la dirección IP, así como el servicio Puerto nombre o número. El prototipo de la función se especifica de la siguiente manera:

#include < sys/socket.h >
#include < netdb.h >
 
int getnameinfo(Const struct sockaddr *sa, salen socklen_t,
                Char *host, size_t hostlen,
                Char *Serv, size_t servlen,
                int banderas);

freeaddrinfo()

Esta función va a liberar la memoria reservada por la getaddrinfo() función. Como el resultado de esta última es una lista de enlace de las estructuras addrinfo, freeaddrinfo() bucle a través de la lista y cada uno vuelta libre

#include < sys/socket.h >
#include < netdb.h >
 
vacío freeaddrinfo(struct addrinfo *ai);
  • ai es la cabeza de la lista de addinfo

Ejemplo

El ejemplo siguiente utiliza getaddrinfo() para resolver el nombre de dominio www.example.com en su lista de direcciones y luego getnameinfo() en cada resultado para devolver el nombre canónico para la dirección. En general, esto producirá el original nombre de host, a menos que la dirección particular tiene varios nombres, en cuyo caso el canónica nombre se devuelve. En este ejemplo, el nombre de dominio se imprimirán tres veces, una vez para cada uno de los tres resultados obtenidos.

#include < stdio.h >
#include < stdlib.h >
#include < netdb.h >
#include < netinet/in.h >
#include < sys/socket.h >
 
#ifndef NI_MAXHOST
#define NI_MAXHOST 1025
#endif
 
int principal(vacío)
{
    struct addrinfo *resultado;
    struct addrinfo *res;
    int error;
 
    / * resolver el nombre de dominio en una lista de direcciones * /
error = getaddrinfo("www.example.com", NULL, NULL, &resultado);
    if (error != 0)
    {   
        if (error == EAI_SYSTEM)
        {
            perror("getaddrinfo");
        }
        más
        {
            fprintf(stderr, "error en getaddrinfo: %s\n", gai_strerror(error));
        }   
        salida(EXIT_FAILURE);
    }   
 
    / * bucle sobre todos los resultados devueltos y hacer búsqueda inversa * /
    para (res = resultado; res != NULL; res = res->ai_next)
    {   
        Char nombre de host[NI_MAXHOST];
error = getnameinfo(res->ai_addr, res->ai_addrlen, nombre de host, NI_MAXHOST, NULL, 0, 0); 
        if (error != 0)
        {
            fprintf(stderr, "error en getnameinfo: %s\n", gai_strerror(error));
            continuar;
        }
        if (*nombre de host != '\0')
            printf("hostname: %s\n", nombre de host);
    } freeaddrinfo(resultado);
    retorno 0;
}

Véase también

  • Dirección de red

Enlaces externos

  • RFC 3493, Las extensiones de interfaz básico toma para IPv6

Referencias

  1. ^ R. Stevens, Fenner, Rudoff [2003] UNIX ® red programación volumen 1, tercera edición: Los zócalos API de red. Editorial: Addison-Wesley Professional. Pub. Fecha: 14 de noviembre de 2003 pág. 256
  2. ^ Hajimu UMEMOTO [2000] getaddrinfo.c acceder desde: https://www.opensource.Apple.com/Source/passwordserver_sasl/passwordserver_sasl-14/cyrus_sasl/lib/getaddrinfo.c

Otras Páginas

Obtenido de"https://en.copro.org/w/index.php?title=getaddrinfo&oldid=637186440"