Estructura ADDRINFOEXW (ws2def.h)
La función GetAddrInfoEx usa la estructura addrinfoex para contener la información de dirección del host.
Sintaxis
typedef struct addrinfoexW {
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;
LPGUID ai_provider;
struct addrinfoexW *ai_next;
} ADDRINFOEXW, *PADDRINFOEXW, *LPADDRINFOEXW;
Miembros
ai_flags
Tipo: int
Marcas que indican las opciones usadas en la función GetAddrInfoEx .
Los valores admitidos para el miembro ai_flags se definen en el archivo de inclusión Winsock2.h y pueden ser una combinación de las siguientes opciones.
Valor | Significado |
---|---|
|
La dirección del socket se usará en una llamada a la función bind . |
|
El nombre canónico se devuelve en el primer miembro ai_canonname .
Cuando se establecen los bits de AI_CANONNAME y AI_FQDN , se devuelve una estructura addrinfoex2 no la estructura addrinfoex . |
|
El parámetro nodename pasado a la función GetAddrInfoEx debe ser una cadena numérica. |
|
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. |
|
GetAddrInfoEx 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 solo se admite en Windows Vista y versiones posteriores. |
|
Si se produce un error en la solicitud GetAddrInfoEx para direcciones IPv6, se realiza una solicitud de servicio de nombre para las direcciones IPv4 y estas direcciones se convierten en formato de dirección IPv6 asignada a IPv4.
Esta opción se admite en Windows Vista y versiones posteriores. |
|
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. En el parámetro ppResults devuelto por GetAddrInfoEx, esta marca se establece en el miembro ai_flags de la estructura addrinfoex para resultados no autoritativos. Esta opción solo se admite en Windows Vista y versiones posteriores para el espacio de nombres NS_EMAIL . |
|
La información de dirección procede de un canal seguro. Si se establece el bit de AI_SECURE , 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. En el parámetro ppResults devuelto por GetAddrInfoEx, esta marca se establece en el miembro ai_flags de la estructura addrinfoex para los resultados devueltos 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 . |
|
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 espacio de nombres NS_EMAIL devolverá nombres preferidos para la publicación. En el parámetro ppResults devuelto por GetAddrInfoEx, esta marca se establece en el miembro ai_flags de la estructura addrinfoex para los resultados devueltos para los 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 . |
|
El nombre de dominio completo se devuelve en el primer miembro ai_canonicalname .
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 finalmente se resolvió. Cuando se establecen los bits de AI_CANONNAME y AI_FQDN , se devuelve una estructura addrinfoex2 no la estructura addrinfoex . Esta opción se admite en Windows 7, Windows Server 2008 R2 y versiones posteriores. |
|
Sugerencia al proveedor de espacios de nombres que se está consultando el nombre de host se está usando en un escenario de recurso compartido de archivos. El proveedor de espacios de nombres puede omitir esta sugerencia.
Esta opción se admite en Windows 7, Windows Server 2008 R2 y versiones posteriores. |
|
Deshabilite la codificación automática de nombres de dominio internacionales mediante Punycode en las funciones de resolución de nombres llamadas por la función GetAddrInfoEx .
Esta opción se admite en Windows 8, Windows Server 2012 y versiones posteriores. |
ai_family
Tipo: int
La familia de direcciones. Los valores posibles para la familia de direcciones se definen en el archivo de inclusión Winsock2.h .
En el Windows SDK publicado para Windows Vista y versiones posteriores, la organización de los archivos de encabezado ha cambiado y 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 Ws2def.h se incluye automáticamente en Winsock2.h y 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énticas (por ejemplo, AF_UNSPEC y PF_UNSPEC), por lo que se puede usar cualquiera de las constantes.
En la tabla siguiente se enumeran los valores comunes de la familia de direcciones, aunque muchos otros valores son posibles.
ai_socktype
Tipo: int
Tipo de socket. Los valores posibles para el tipo de socket se definen en el archivo de inclusión Winsock2.h .
En la tabla siguiente se enumeran los valores posibles para el tipo de socket admitido para Windows Sockets 2:
Valor | Significado |
---|---|
|
Proporciona secuencias de bytes secuenciadas, confiables, bidireccionales y basadas en conexiones 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. |
|
Admite datagramas, que son búferes no confiables sin conexión con una longitud máxima fija (normalmente corta). Usa el Protocolo de datagramas de usuario (UDP) para la familia de direcciones de Internet (AF_INET o AF_INET6). |
|
Proporciona un socket sin formato 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. |
|
Proporciona un datagrama de mensaje confiable. Un ejemplo de este tipo es la implementación del protocolo de multidifusión general pragmática (PGM) en Windows, a menudo denominada programación de multidifusión confiable. |
|
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 los archivos de encabezado 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: int
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 en los archivos de encabezado Wsrm.h .
En el Windows SDK publicado para Windows Vista y versiones posteriores, la organización de los 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 Ws2def.h se incluye automáticamente en Winsock2.h y 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.
Si el miembro ai_family es AF_IRDA, el ai_protocol debe ser 0.
ai_addrlen
Tipo: size_t
Longitud, en bytes, del búfer al que apunta el miembro ai_addr .
ai_canonname
Tipo: PCTSTR
Nombre canónico del host.
ai_addr
Tipo: struct sockaddr*
Puntero a una estructura de sockaddr . El miembro ai_addr en cada estructura addrinfoex devuelta apunta a una estructura de direcciones de socket rellenada. La longitud, en bytes, de cada estructura addrinfoex devuelta se especifica en el miembro ai_addrlen .
ai_blob
Tipo: void*
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
Tipo: size_t
Longitud, en bytes, del miembro ai_blob .
ai_provider
Tipo: LPGUID
Puntero al GUID de un proveedor de espacio de nombres específico.
ai_next
Tipo: struct addrinfoex*
Puntero a la siguiente estructura de una lista vinculada. Este parámetro se establece en NULL en la última estructura addrinfoex de una lista vinculada.
Comentarios
La función GetAddrInfoEx usa la estructura addrinfoex para contener la información de dirección del host. La estructura addrinfoex es una versión mejorada de las estructuras addrinfo y addrinfoW . Los miembros de estructura adicionales son para los datos de blob y el GUID para el proveedor de espacios de nombres. Los datos del blob 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 blob para proporcionar información adicional.
La estructura addrinfoex es una versión mejorada de la estructura addrinfo y addrinfoW usada con la función GetAddrInfoEx . 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 archivo de hosts local, un proveedor de correo electrónico (el espacio de nombres NS_EMAIL ) o por otros mecanismos de nomenclatura.
Cuando se define UNICODE o _UNICODE, addrinfoex se define para addrinfoexW, la versión Unicode de esta estructura. Los parámetros de cadena se definen en el tipo de datos PWSTR y se usa la estructura addrinfoexW .
Cuando no se define UNICODE o _UNICODE, addrinfoex se define para addrinfoexA, la versión ANSI de esta estructura. Los parámetros de cadena son del tipo de datos PCSTR y se usa la estructura addrinfoexA .
Tras una llamada correcta a GetAddrInfoEx, se devuelve una lista vinculada de estructuras addrinfoex 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 estructura addrinfoex devuelta hasta que se encuentre un puntero NULL . En cada estructura addrinfoex devuelta, los miembros ai_family, ai_socktype y ai_protocol corresponden a los argumentos respectivos en una llamada de función WSASocket o socket. Además, el miembro ai_addr en cada estructura addrinfoex devuelta apunta a una estructura de direcciones de socket rellenada, la longitud de la cual se especifica en su miembro ai_addrlen .
Ejemplos
En el ejemplo siguiente se muestra el uso de la estructura addrinfoex .
#ifndef UNICODE
#define UNICODE
#endif
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
int __cdecl wmain(int argc, wchar_t ** argv)
{
//--------------------------------
// Declare and initialize variables.
WSADATA wsaData;
int iResult;
ADDRINFOEX *result = NULL;
ADDRINFOEX *ptr = NULL;
ADDRINFOEX hints;
DWORD dwRetval = 0;
int i = 1;
DWORD dwNamespace = NS_DNS;
LPGUID lpNspid = NULL;
struct sockaddr_in *sockaddr_ipv4;
struct sockaddr_in6 *sockaddr_ipv6;
// LPSOCKADDR sockaddr_ip;
wchar_t ipstringbuffer[46];
// Validate the parameters
if (argc != 3) {
wprintf(L"usage: %ws <hostname> <servicename>\n", argv[0]);
wprintf(L" provides protocol-independent translation\n");
wprintf(L" from a host name to an IP address\n");
wprintf(L"%ws example usage\n", argv[0]);
wprintf(L" %ws www.contoso.com 0\n", argv[0]);
return 1;
}
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
wprintf(L"WSAStartup failed: %d\n", iResult);
return 1;
}
//--------------------------------
// Setup the hints address info structure
// which is passed to the GetAddrInfoW() function
memset(&hints, 0, sizeof (hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
wprintf(L"Calling GetAddrInfoEx with following parameters:\n");
wprintf(L"\tName = %ws\n", argv[1]);
wprintf(L"\tServiceName (or port) = %ws\n\n", argv[2]);
//--------------------------------
// Call GetAddrInfoEx(). If the call succeeds,
// the aiList variable will hold a linked list
// of ADDRINFOEX structures containing response
// information about the host
dwRetval = GetAddrInfoEx(argv[1], argv[2],
dwNamespace, lpNspid, &hints, &result,
NULL, NULL, NULL, NULL);
if (dwRetval != 0) {
wprintf(L"GetAddrInfoEx failed with error: %d\n", dwRetval);
WSACleanup();
return 1;
}
wprintf(L"GetAddrInfoEx returned success\n");
// Retrieve each address and print out the hex bytes
for (ptr = result; ptr != NULL; ptr = ptr->ai_next) {
wprintf(L"GetAddrInfoEx response %d\n", i++);
wprintf(L"\tFlags: 0x%x\n", ptr->ai_flags);
wprintf(L"\tFamily: ");
switch (ptr->ai_family) {
case AF_UNSPEC:
wprintf(L"Unspecified\n");
break;
case AF_INET:
wprintf(L"AF_INET (IPv4)\n");
// the InetNtop function is available on Windows Vista and later
sockaddr_ipv4 = (struct sockaddr_in *) ptr->ai_addr;
wprintf(L"\tIPv4 address %ws\n",
InetNtop(AF_INET, &sockaddr_ipv4->sin_addr, ipstringbuffer,
46));
// We could also use the WSAAddressToString function
// sockaddr_ip = (LPSOCKADDR) ptr->ai_addr;
// The buffer length is changed by each call to WSAAddresstoString
// So we need to set it for each iteration through the loop for safety
// ipbufferlength = 46;
// iRetval = WSAAddressToString(sockaddr_ip, (DWORD) ptr->ai_addrlen, NULL,
// ipstringbuffer, &ipbufferlength );
// if (iRetval)
// wprintf(L"WSAAddressToString failed with %u\n", WSAGetLastError() );
// else
// wprintf(L"\tIPv4 address %ws\n", ipstringbuffer);
break;
case AF_INET6:
wprintf(L"AF_INET6 (IPv6)\n");
// the InetNtop function is available on Windows Vista and later
sockaddr_ipv6 = (struct sockaddr_in6 *) ptr->ai_addr;
wprintf(L"\tIPv6 address %ws\n",
InetNtop(AF_INET6, &sockaddr_ipv6->sin6_addr,
ipstringbuffer, 46));
// We could also use WSAAddressToString which also returns the scope ID
// sockaddr_ip = (LPSOCKADDR) ptr->ai_addr;
// The buffer length is changed by each call to WSAAddresstoString
// So we need to set it for each iteration through the loop for safety
// ipbufferlength = 46;
//iRetval = WSAAddressToString(sockaddr_ip, (DWORD) ptr->ai_addrlen, NULL,
// ipstringbuffer, &ipbufferlength );
//if (iRetval)
// wprintf(L"WSAAddressToString failed with %u\n", WSAGetLastError() );
//else
// wprintf(L"\tIPv6 address %ws\n", ipstringbuffer);
break;
default:
wprintf(L"Other %ld\n", ptr->ai_family);
break;
}
wprintf(L"\tSocket type: ");
switch (ptr->ai_socktype) {
case 0:
wprintf(L"Unspecified\n");
break;
case SOCK_STREAM:
wprintf(L"SOCK_STREAM (stream)\n");
break;
case SOCK_DGRAM:
wprintf(L"SOCK_DGRAM (datagram) \n");
break;
case SOCK_RAW:
wprintf(L"SOCK_RAW (raw) \n");
break;
case SOCK_RDM:
wprintf(L"SOCK_RDM (reliable message datagram)\n");
break;
case SOCK_SEQPACKET:
wprintf(L"SOCK_SEQPACKET (pseudo-stream packet)\n");
break;
default:
wprintf(L"Other %ld\n", ptr->ai_socktype);
break;
}
wprintf(L"\tProtocol: ");
switch (ptr->ai_protocol) {
case 0:
wprintf(L"Unspecified\n");
break;
case IPPROTO_TCP:
wprintf(L"IPPROTO_TCP (TCP)\n");
break;
case IPPROTO_UDP:
wprintf(L"IPPROTO_UDP (UDP) \n");
break;
default:
wprintf(L"Other %ld\n", ptr->ai_protocol);
break;
}
wprintf(L"\tLength of this sockaddr: %d\n", ptr->ai_addrlen);
wprintf(L"\tCanonical name: %s\n", ptr->ai_canonname);
}
FreeAddrInfoEx(result);
WSACleanup();
return 0;
}
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows Vista [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows Server 2008 [solo aplicaciones de escritorio] |
Encabezado | ws2def.h (incluye Windows Server 2012, Windows 7 Windows Server 2008 R2) |