Compartir a través de


estructura ADDRINFOEX4 (ws2def.h)

La estructura addrinfoex4 se usa en la función GetAddrInfoEx para contener información de dirección de host cuando se ha solicitado una interfaz de red específica.

Sintaxis

typedef struct addrinfoex4 {
  int                ai_flags;
  int                ai_family;
  int                ai_socktype;
  int                ai_protocol;
  size_t             ai_addrlen;
  PWSTR              ai_canonname;
  struct sockaddr    *ai_addr;
  void               *ai_blob;
  size_t             ai_bloblen;
  GUID               *ai_provider;
  struct addrinfoex4 *ai_next;
  int                ai_version;
  PWSTR              ai_fqdn;
  int                ai_interfaceindex;
  HANDLE             ai_resolutionhandle;
} ADDRINFOEX4, *PADDRINFOEX4, *LPADDRINFOEX4;

Miembros

ai_flags

Marcas que indican las opciones usadas en la función GetAddrInfoEx.

Los valores admitidos para el miembro ai_flags se definen en el winsock2.h archivo de inclusión y pueden ser una combinación de las siguientes opciones.

Valor Significado
AI_PASSIVE
0x01
La dirección del socket se usará en una llamada a la función enlazar.
AI_CANONNAME
0x02
El nombre canónico se devuelve en el primer miembro ai_canonname.
AI_NUMERICHOST
0x04
El parámetro nodename pasado a la función GetAddrInfoEx debe ser una cadena numérica.
AI_ALL
0x0100
Si se establece este bit, se realiza una solicitud para las direcciones IPv6 e IPv4 con AI_V4MAPPED.

Esta opción se admite en Windows Vista y versiones posteriores.

AI_ADDRCONFIG
0x0400
El GetAddrInfoEx de solo se resolverá si se configura una dirección global. La dirección de bucle invertido IPv6 e IPv4 no se considera una dirección global válida.

Esta opción se admite en Windows Vista y versiones posteriores.

AI_V4MAPPED
0x0800
Si se produce un error en la solicitud de getAddrInfoEx de para una dirección IPv6, se realiza una solicitud de servicio de nombre para direcciones IPv4 y estas direcciones se convierten en formato de dirección IPv4 asignado a IPv6.

Esta opción se admite en Windows Vista y versiones posteriores.

AI_NON_AUTHORITATIVE
0x04000
La información de dirección procede de resultados no autoritativos.

Cuando esta opción se establece en el parámetro pHints de GetAddrInfoEx, el proveedor de espacios de nombres NS_EMAIL devuelve resultados autoritativos y no autoritativos. Si no se establece esta opción, solo se devuelven los resultados autoritativos.

Esta opción solo se admite en Windows Vista y versiones posteriores para el espacio de nombres NS_EMAIL.

AI_SECURE
0x08000
La información de dirección procede de un canal seguro.

Si se establece el AI_SECURE bit, el proveedor de espacio de nombres NS_EMAIL devolverá los resultados obtenidos con seguridad mejorada para minimizar la posible suplantación de identidad.

Cuando esta opción se establece en el parámetro pHints de GetAddrInfoEx, el proveedor de espacio de nombres NS_EMAIL devuelve solo los resultados obtenidos con seguridad mejorada para minimizar la posible suplantación de identidad.

Esta opción solo se admite en Windows Vista y versiones posteriores para el espacio de nombres NS_EMAIL.

AI_RETURN_PREFERRED_NAMES
0x010000
La información de dirección es para los nombres preferidos para la publicación con un espacio de nombres específico.

Cuando esta opción se establece en el parámetro pHints de GetAddrInfoEx, no se debe proporcionar ningún nombre en el parámetro pName y el proveedor de espacios de nombres de NS_EMAIL devolverá nombres preferidos para la publicación.

Esta opción solo se admite en Windows Vista y versiones posteriores para el espacio de nombres NS_EMAIL.

AI_FQDN
0x00020000
El nombre de dominio completo se devuelve en el primer miembro ai_fqdn.

Cuando esta opción se establece en el parámetro pHints de GetAddrInfoEx y se especifica un nombre plano (etiqueta única) en el parámetro pName, se devolverá el nombre de dominio completo que el nombre finalmente resolvió.

Esta opción es compatible con Windows 7, Windows Server 2008 R2 y versiones posteriores.

AI_FILESERVER
0x00040000
Sugerencia al proveedor de espacios de nombres que se está consultando el nombre de host que se está usando en un escenario de recurso compartido de archivos. El proveedor de espacios de nombres puede omitir esta sugerencia.

Esta opción es compatible con Windows 7, Windows Server 2008 R2 y versiones posteriores.

AI_DISABLE_IDN_ENCODING
0x00080000
Deshabilite la codificación automática de nombres de dominio internacionales mediante Punycode en las funciones de resolución de nombres a las que llama la función GetAddrInfoEx de.

Esta opción es compatible con Windows 8, Windows Server 2012 y versiones posteriores.

AI_EXTENDED
0x80000000
Indica que el objeto actual se extiende: es decir, un addrinfoex2 o superior.

Esta opción se admite en Windows 8.1, Windows Server 2012 R2 y versiones posteriores.

AI_RESOLUTION_HANDLE
0x40000000
Se devuelve un identificador de resolución en el miembro ai_resolutionhandle.

Esta opción se admite en Windows 10, Windows Server 2016 y versiones posteriores.

ai_family

Familia de direcciones.

Los valores posibles para la familia de direcciones se definen en el archivo de encabezado Ws2def.h. Tenga en cuenta que el archivo de encabezado de Ws2def.h se incluye automáticamente en Winsock2.hy nunca se debe usar directamente.

Los valores admitidos actualmente son AF_INET o AF_INET6, que son los formatos de familia de direcciones de Internet para IPv4 e IPv6. Se admiten otras opciones para la familia de direcciones (AF_NETBIOS para su uso con NetBIOS, por ejemplo) si se instala un proveedor de servicios de Windows Sockets para la familia de direcciones. Tenga en cuenta que los valores de la familia de direcciones AF_ y las constantes de familia de protocolos PF_ son idénticos (por ejemplo, AF_INET y PF_INET), por lo que se puede usar cualquier constante.

En la tabla siguiente se enumeran los valores comunes de la familia de direcciones, aunque muchos otros valores son posibles.

Valor Significado
AF_UNSPEC
0
La familia de direcciones no está especificada.
AF_INET
2
Familia de direcciones del Protocolo de Internet versión 4 (IPv4).
AF_NETBIOS
17
Familia de direcciones NetBIOS. Esta familia de direcciones solo se admite si se instala un proveedor de Windows Sockets para NetBIOS.
AF_INET6
23
Familia de direcciones del Protocolo de Internet versión 6 (IPv6).
AF_IRDA
26
Familia de direcciones de la Asociación de datos infrarrojos (IrDA). Esta familia de direcciones solo se admite si el equipo tiene instalado un puerto infrarrojo y un controlador.
AF_BTH
32
La familia de direcciones Bluetooth. Esta familia de direcciones solo se admite si se instala un adaptador Bluetooth.

ai_socktype

Tipo de socket. Los valores posibles para el tipo de socket se definen en el winsock2.h archivo de inclusión.

En la tabla siguiente se enumeran los valores posibles para el tipo de socket admitido para Windows Sockets 2:

Valor Significado
SOCK_STREAM
1
Proporciona flujos de bytes secuenciados, confiables, bidireccionales y basados en la conexión con un mecanismo de transmisión de datos OOB. Usa el Protocolo de control de transmisión (TCP) para la familia de direcciones de Internet (AF_INET o AF_INET6). Si el miembro ai_family es AF_IRDA, SOCK_STREAM es el único tipo de socket admitido.
SOCK_DGRAM
2
Admite datagramas, que son a menos que los búferes no confiables de una longitud máxima fija (normalmente pequeña). Usa el Protocolo de datagramas de usuario (UDP) para la familia de direcciones de Internet (AF_INET o AF_INET6).
SOCK_RAW
3
Proporciona un socket sin procesar que permite a una aplicación manipular el siguiente encabezado de protocolo de capa superior. Para manipular el encabezado IPv4, la opción de socket IP_HDRINCL debe establecerse en el socket. Para manipular el encabezado IPv6, la opción de socket IPV6_HDRINCL debe establecerse en el socket.
SOCK_RDM
4
Proporciona un datagrama de mensaje confiable. Un ejemplo de este tipo es la implementación pragmática del protocolo de multidifusión general (PGM) en Windows, a menudo denominada programación confiable de multidifusión.
SOCK_SEQPACKET
5
Proporciona un paquete pseudo-stream basado en datagramas.
 

En Windows Sockets 2, se introdujeron nuevos tipos de socket. Una aplicación puede detectar dinámicamente los atributos de cada protocolo de transporte disponible a través de la función WSAEnumProtocols. Por lo tanto, una aplicación puede determinar las posibles opciones de tipo de socket y protocolo para una familia de direcciones y usar esta información al especificar este parámetro. Las definiciones de tipo de socket en el de Winsock2.h y Ws2def.h se actualizarán periódicamente a medida que se definen nuevos tipos de socket, familias de direcciones y protocolos.

En Windows Sockets 1.1, los únicos tipos de socket posibles son SOCK_DATAGRAM y SOCK_STREAM.

ai_protocol

Tipo de protocolo. Las opciones posibles son específicas de la familia de direcciones y el tipo de socket especificado. Los valores posibles para el ai_protocol se definen en Winsock2.h y los archivos de encabezado Wsrm.h de.

En windows SDK publicado para Windows Vista y versiones posteriores, la organización de archivos de encabezado ha cambiado y este miembro puede ser uno de los valores del tipo de enumeración IPPROTO definido en el archivo de encabezado Ws2def.h. Tenga en cuenta que el archivo de encabezado de Ws2def.h se incluye automáticamente en Winsock2.hy nunca se debe usar directamente.

Si se especifica un valor de 0 para ai_protocol, el autor de la llamada no desea especificar un protocolo y el proveedor de servicios elegirá el ai_protocol que se va a usar. En el caso de los protocolos distintos de IPv4 e IPv6, establezca ai_protocol en cero.

En la tabla siguiente se enumeran los valores comunes para el miembro ai_protocol, aunque muchos otros valores son posibles.

Valor Significado
IPPROTO_TCP
6
Protocolo de control de transmisión (TCP). Este es un valor posible cuando el miembro ai_family es AF_INET o AF_INET6 y el miembro ai_socktype es SOCK_STREAM.
IPPROTO_UDP
17
Protocolo de datagramas de usuario (UDP). Este es un valor posible cuando el miembro de ai_family es AF_INET o AF_INET6 y el parámetro de tipo es SOCK_DGRAM.
IPPROTO_RM
113
Protocolo PGM para multidifusión confiable. Este es un valor posible cuando se AF_INET el miembro ai_family y el miembro ai_socktype es SOCK_RDM. En windows SDK publicado para Windows Vista y versiones posteriores, este valor también se denomina IPPROTO_PGM.
 

Si el miembro ai_family es AF_IRDA, el ai_protocol debe ser 0.

ai_addrlen

Longitud, en bytes, del búfer al que apunta el miembro ai_addr.

ai_canonname

Nombre canónico del host.

ai_addr

Puntero a una estructura sockaddr. El miembro ai_addr de cada addrinfoex4 devuelto estructura apunta a una estructura de direcciones de socket rellenada. La longitud, en bytes, de cada addrinfoex4 estructura se especifica en el miembro ai_addrlen.

ai_blob

Puntero a los datos que se usan para devolver información de espacio de nombres específica del proveedor asociada al nombre más allá de una lista de direcciones. La longitud, en bytes, del búfer al que apunta ai_blob debe especificarse en el miembro ai_bloblen.

ai_bloblen

Longitud, en bytes, del miembro ai_blob.

ai_provider

Puntero al GUID de un proveedor de espacio de nombres específico.

ai_next

Puntero a la siguiente estructura de una lista vinculada. Este parámetro se establece en NULL en la última addrinfoex4 estructura de una lista vinculada.

ai_version

Número de versión de esta estructura. El valor usado actualmente para esta versión de la estructura es 4.

ai_fqdn

Nombre de dominio completo para el host.

ai_interfaceindex

Índice de interfaz, tal como se define en el IP_ADAPTER_ADDRESSES.propiedad IfIndex devuelta en GetAdaptersAddresses.

ai_resolutionhandle

Identificador que apunta al nombre de dominio completo del host.

Observaciones

La estructura addrinfoex4 de se admite en Windows 10 y Windows Server 2016

La función GetAddrInfoExEx de usa la estructura addrinfoex4 para contener información de dirección de host cuando los bits de AI_EXTENDED | AI_FQDN | AI_CANONNAME | AI_RESOLUTION_HANDLE se establecen en el miembro addrinfoex4.ai_flags pasado a través de la GetAddrInfoEx.sugerencias parámetro.

La estructura addrinfoex4 es una versión mejorada del estructura addrinfoex que puede devolver el nombre canónico, el nombre de dominio completo para el host y un identificador para el nombre de dominio completo. A su vez, getAddrInfoEx es una versión mejorada de la addrinfo y estructuras de addrinfoW usadas con las funciones getaddrinfo y GetAddrInfoW. La función getAddrInfoEx permite especificar el proveedor de espacios de nombres para resolver la consulta. Para su uso con el protocolo IPv6 e IPv4, la resolución de nombres puede ser por el Sistema de nombres de dominio (DNS), un local hospeda archivo, un proveedor de correo electrónico (el espacio de nombres NS_EMAIL) o por otros mecanismos de nomenclatura.

Los datos de blob de tha ai_blob miembro se usan para devolver información adicional del espacio de nombres específico del proveedor asociada a un nombre. El formato de los datos del miembro ai_blob es específico de un proveedor de espacios de nombres determinado. Actualmente, el proveedor de espacios de nombres NS_EMAIL usa los datos de blobs para proporcionar información adicional.

Cuando se define UNICODE o _UNICODE, addrinfoex4 se define en addrinfoex4W, la versión Unicode de esta estructura. Los parámetros de cadena se definen en el tipo de datos de PWSTR y se usa la estructura addrinfoex4W.

Cuando no se define UNICODE o _UNICODE, addrinfoex4 se define en addrinfoex4A, la versión ANSI de esta estructura. Los parámetros de cadena son del tipo de datos char * y se usa la estructura addrinfoex4A.

Tras una llamada correcta a GetAddrInfoEx, se devuelve una lista vinculada de estructuras de addrinfoex4 en el parámetro ppResult pasado a la función GetAddrInfoEx. La lista se puede procesar siguiendo el puntero proporcionado en el miembro ai_next de cada addrinfoex4 devuelto estructura hasta que se encuentre un puntero NULL. En cada estructura de addrinfoex4 devuelta, los miembros ai_family, ai_socktypey ai_protocol corresponden a los argumentos respectivos de una de socket de o llamada de función WSASocket. Además, el miembro ai_addr de cada uno de los addrinfoex4 devueltos estructura apunta a una estructura de direcciones de socket rellenada, la longitud de la cual se especifica en su miembro ai_addrlen.

Ejemplos

En el código siguiente se describe cómo realizar una llamada a GetAddrInfoEx con una estructura addrinfoex4 para recuperar el identificador de un FQDN. A continuación, el ejemplo llama a WSAIoctl con la estructura ASSOCIATE_NAMERES_CONTEXT_INPUT.

// 
// Connect to a server using its IPv4 addresses 
// 

VOID 
ConnectServer( 
    PCWSTR server) 
{ 
    int iResult; 
    PADDRINFOEX4 pResult = NULL; 
    ADDRINFOEX3 hints = { 0 }; 
    PADDRINFOEX4 pCur = NULL; 
    WSADATA wsaData; 
    SOCKET connectSocket = INVALID_SOCKET; 
    ULONG bytesReturned = 0; 
    ASSOCIATE_NAMERES_CONTEXT_INPUT input = { 0 }; 
    SOCKADDR_IN clientService; 
    wchar_t ipstringbuffer[46]; 
    String string; 
    DWORD dwRetval; 
    //  
    //  Initialize Winsock 
    // 
    iResult = WSAStartup( 
        MAKEWORD(2, 2),  
        &wsaData); 
    if (iResult != 0) { 
        printf("WSAStartup failed: %d\n", iResult); 
        goto Exit; 
    } 

    //  
    // Create a SOCKET for connection 
    // 
    connectSocket = socket( 
        AF_UNSPEC,  
        SOCK_STREAM,  
        IPPROTO_TCP); 
    if (connectSocket == INVALID_SOCKET)  
    { 
        printf("socket failed: %d\n", WSAGetLastError()); 
        goto Exit; 
    } 

    // 
    // Do name resolution 
    // 

    hints.ai_family = AF_INET; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_flags = AI_EXTENDED | AI_FQDN | AI_CANONNAME | AI_RESOLUTION_HANDLE; 
    hints.ai_version = ADDRINFOEX_VERSION_4; 

    dwRetval = GetAddrInfoExW( 
        server, 
        NULL, 
        NS_DNS, 
        NULL, 
        (const ADDRINFOEXW*)&hints, 
        (PADDRINFOEXW*)&pResult, 
        NULL, 
        NULL, 
        NULL, NULL); 
    if (dwRetval != 0) { 
        printf("GetAddrInfoEx failed with error: %d\n", dwRetval); 
        goto Exit; 
    } 
    input.TransportSettingId.Guid = ASSOCIATE_NAMERES_CONTEXT; 
    input.Handle = pResult->ai_resolutionhandle; 

    // 
    // Associate socket with the handle 
    // 

    if (WSAIoctl( 
            connectSocket, 
            SIO_APPLY_TRANSPORT_SETTING, 
            (VOID *)&input, 
            sizeof(input), 
            NULL, 
            0, 
            &bytesReturned, 
            NULL, 
            NULL) == SOCKET_ERROR) 
    if (iResult != 0){ 
        printf("WSAIoctl failed: %d\n", WSAGetLastError()); 
        goto Exit; 
    }     

    // 
    // Connect to server 
    // 

    pCur = pResult; 
    while (pCur != NULL) 
    { 
        if (pCur->ai_addr->sa_family == AF_INET) 
        { 
            clientService = *(const sockaddr_in*)pCur->ai_addr; 
            clientService.sin_port = htons(80); 
            if (connect( 
                connectSocket, 
                (const SOCKADDR *)&clientService, 
                sizeof(clientService)) == SOCKET_ERROR) 
            { 
                printf("connect failed: %d\n", WSAGetLastError()); 
                goto Exit; 
            } 
        } 
        pCur = pCur->ai_next; 
    } 

Exit: 

    if (connectSocket != INVALID_SOCKET) 
    { 
        closesocket(connectSocket); 
    } 
    if (pResult) 
    { 
        FreeAddrInfoExW((ADDRINFOEXW*)pResult); 
    } 
    WSACleanup(); 
    return; 
} 

Requisitos

Requisito Valor
cliente mínimo admitido Windows 10 [solo aplicaciones de escritorio]
servidor mínimo admitido Windows Server 2016 [solo aplicaciones de escritorio]
encabezado de ws2def.h

Consulte también

GetAddrInfoEx

addrinfo

addrinfoW

addrinfoex

addrinfoex3