structure ADDRINFOEX4 (ws2def.h)
La structure addrinfoex4 est utilisée par la fonction GetAddrInfoEx pour stocker les informations d’adresse de l’hôte lorsqu’une interface réseau spécifique a été demandée.
Syntaxe
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;
Membres
ai_flags
Indicateurs qui indiquent les options utilisées dans la fonction GetAddrInfoEx .
Les valeurs prises en charge pour le membre ai_flags sont définies dans le fichier Include Winsock2.h et peuvent être une combinaison des options suivantes.
Valeur | Signification |
---|---|
|
L’adresse de socket sera utilisée dans un appel à la fonction de liaison . |
|
Le nom canonique est retourné dans le premier membre ai_canonname . |
|
Le paramètre nodename passé à la fonction GetAddrInfoEx doit être une chaîne numérique. |
|
Si ce bit est défini, une requête est effectuée pour les adresses IPv6 et IPv4 avec AI_V4MAPPED.
Cette option est prise en charge sur Windows Vista et versions ultérieures. |
|
L’objet GetAddrInfoEx est résolu uniquement si une adresse globale est configurée. L’adresse de bouclage IPv6 et IPv4 n’est pas considérée comme une adresse globale valide.
Cette option est prise en charge sur Windows Vista et versions ultérieures. |
|
Si la demande GetAddrInfoEx pour une adresse IPv6 échoue, une demande de service de nom est effectuée pour les adresses IPv4 et ces adresses sont converties au format d’adresse IPv6 mappé iPv4.
Cette option est prise en charge sur Windows Vista et versions ultérieures. |
|
Les informations d’adresse proviennent de résultats qui ne font pas autorité.
Lorsque cette option est définie dans le paramètre pHints de GetAddrInfoEx, le fournisseur d’espaces de noms NS_EMAIL retourne des résultats faisant autorité et non faisant autorité. Si cette option n’est pas définie, seuls les résultats faisant autorité sont retournés. Cette option est uniquement prise en charge sur Windows Vista et versions ultérieures pour l’espace de noms NS_EMAIL . |
|
Les informations d’adresse proviennent d’un canal sécurisé.
Si le bit AI_SECURE est défini, le fournisseur d’espace de noms NS_EMAIL retourne les résultats obtenus avec une sécurité renforcée pour réduire l’usurpation possible. Lorsque cette option est définie dans le paramètre pHints de GetAddrInfoEx, le fournisseur d’espaces de noms NS_EMAIL retourne uniquement les résultats obtenus avec une sécurité renforcée pour réduire l’usurpation possible. Cette option est uniquement prise en charge sur Windows Vista et versions ultérieures pour l’espace de noms NS_EMAIL . |
|
Les informations d’adresse concernent les noms préférés pour la publication avec un espace de noms spécifique.
Lorsque cette option est définie dans le paramètre pHints de GetAddrInfoEx, aucun nom ne doit être fourni dans le paramètre pName et le NS_EMAIL fournisseur d’espaces de noms retourne les noms préférés pour publication. Cette option est uniquement prise en charge sur Windows Vista et versions ultérieures pour l’espace de noms NS_EMAIL . |
|
Le nom de domaine complet est retourné dans le premier membre ai_fqdn .
Lorsque cette option est définie dans le paramètre pHints de GetAddrInfoEx et qu’un nom plat (étiquette unique) est spécifié dans le paramètre pName , le nom de domaine complet dont le nom a finalement été résolu est retourné. Cette option est prise en charge sur Windows 7, Windows Server 2008 R2 et versions ultérieures. |
|
Indique au fournisseur d’espace de noms que le nom d’hôte interrogé est utilisé dans un scénario de partage de fichiers. Le fournisseur d’espaces de noms peut ignorer cet indicateur.
Cette option est prise en charge sur Windows 7, Windows Server 2008 R2 et versions ultérieures. |
|
Désactivez l’encodage automatique de nom de domaine international à l’aide de Punycode dans les fonctions de résolution de noms appelées par la fonction GetAddrInfoEx .
Cette option est prise en charge sur Windows 8, Windows Server 2012 et versions ultérieures. |
|
Indique que l’objet actuel est étendu : c’est-à-dire un addrinfoex2 ou supérieur.
Cette option est prise en charge sur Windows 8.1, Windows Server 2012 R2 et versions ultérieures. |
|
Un handle de résolution est retourné dans le membre ai_resolutionhandle .
Cette option est prise en charge sur Windows 10, Windows Server 2016 et versions ultérieures. |
ai_family
Famille d’adresses.
Les valeurs possibles pour la famille d’adresses sont définies dans le fichier d’en-tête Ws2def.h . Notez que le fichier d’en-tête Ws2def.h est automatiquement inclus dans Winsock2.h et ne doit jamais être utilisé directement.
Les valeurs actuellement prises en charge sont AF_INET ou AF_INET6, qui sont les formats de famille d’adresses Internet pour IPv4 et IPv6. D’autres options pour la famille d’adresses (AF_NETBIOS à utiliser avec NetBIOS, par exemple) sont prises en charge si un fournisseur de services Windows Sockets pour la famille d’adresses est installé. Notez que les valeurs de la famille d’adresses AF_ et des constantes de famille de protocole PF_ sont identiques (par exemple , AF_INET et PF_INET), de sorte que l’une ou l’autre constante peut être utilisée.
Le tableau ci-dessous répertorie les valeurs courantes pour la famille d’adresses, bien que de nombreuses autres valeurs soient possibles.
ai_socktype
Type de socket. Les valeurs possibles pour le type de socket sont définies dans le fichier include Winsock2.h .
Le tableau suivant répertorie les valeurs possibles pour le type de socket pris en charge pour les sockets Windows 2 :
Valeur | Signification |
---|---|
|
Fournit des flux d’octets séquencés, fiables, bidirectionnel et basés sur la connexion avec un mécanisme de transmission de données OOB. Utilise le protocole TCP (Transmission Control Protocol) pour la famille d’adresses Internet (AF_INET ou AF_INET6). Si le membre ai_family est AF_IRDA, SOCK_STREAM est le seul type de socket pris en charge. |
|
Prend en charge les datagrammes, qui sont des mémoires tampons sans connexion et peu fiables d’une longueur maximale fixe (généralement petite). Utilise le protocole UDP (User Datagram Protocol) pour la famille d’adresses Internet (AF_INET ou AF_INET6). |
|
Fournit un socket brut qui permet à une application de manipuler l’en-tête de protocole de couche supérieure suivant. Pour manipuler l’en-tête IPv4, l’option de socket IP_HDRINCL doit être définie sur le socket. Pour manipuler l’en-tête IPv6, l’option de socket IPV6_HDRINCL doit être définie sur le socket. |
|
Fournit un datagramme de message fiable. Un exemple de ce type est l’implémentation du protocole de multidiffusion PGM (Pragmatic General Multicast) dans Windows, souvent appelée programmation multidiffusion fiable. |
|
Fournit un paquet de pseudo-flux basé sur des datagrammes. |
Dans les sockets Windows 2, de nouveaux types de sockets ont été introduits. Une application peut découvrir dynamiquement les attributs de chaque protocole de transport disponible via la fonction WSAEnumProtocols . Ainsi, une application peut déterminer le type de socket et les options de protocole possibles pour une famille d’adresses et utiliser ces informations lors de la spécification de ce paramètre. Les définitions de type de socket dans les fichiers d’en-tête Winsock2.h et Ws2def.h seront régulièrement mises à jour à mesure que de nouveaux types de sockets, familles d’adresses et protocoles seront définis.
Dans les sockets Windows 1.1, les seuls types de sockets possibles sont SOCK_DATAGRAM et SOCK_STREAM.
ai_protocol
Type de protocole. Les options possibles sont spécifiques à la famille d’adresses et au type de socket spécifiés. Les valeurs possibles pour les ai_protocol sont définies dans Winsock2.h et les fichiers d’en-tête Wsrm.h .
Sur le SDK Windows publié pour Windows Vista et versions ultérieures, le organization des fichiers d’en-tête a changé et ce membre peut être l’une des valeurs du type d’énumération IPPROTO défini dans le fichier d’en-tête Ws2def.h. Notez que le fichier d’en-tête Ws2def.h est automatiquement inclus dans Winsock2.h et ne doit jamais être utilisé directement.
Si la valeur 0 est spécifiée pour ai_protocol, l’appelant ne souhaite pas spécifier de protocole et le fournisseur de services choisit le ai_protocol à utiliser. Pour les protocoles autres que IPv4 et IPv6, définissez ai_protocol sur zéro.
Le tableau suivant répertorie les valeurs courantes pour le membre ai_protocol bien que de nombreuses autres valeurs soient possibles.
Si le membre ai_family est AF_IRDA, le ai_protocol doit être 0.
ai_addrlen
Longueur, en octets, de la mémoire tampon pointée par le membre ai_addr .
ai_canonname
Nom canonique de l’hôte.
ai_addr
Pointeur vers une structure de sockaddr . Le membre ai_addr dans chaque structure addrinfoex4 retournée pointe vers une structure d’adresse de socket remplie. La longueur, en octets, de chaque structure addrinfoex4 retournée est spécifiée dans le membre ai_addrlen .
ai_blob
Pointeur vers des données qui est utilisé pour retourner des informations d’espace de noms spécifiques au fournisseur associées au nom au-delà d’une liste d’adresses. La longueur, en octets, de la mémoire tampon pointée par ai_blob doit être spécifiée dans le membre ai_bloblen .
ai_bloblen
Longueur, en octets, du membre ai_blob .
ai_provider
Pointeur vers le GUID d’un fournisseur d’espace de noms spécifique.
ai_next
Pointeur vers la structure suivante dans une liste liée. Ce paramètre a la valeur NULL dans la dernière structure addrinfoex4 d’une liste liée.
ai_version
Numéro de version de cette structure. La valeur actuellement utilisée pour cette version de la structure est 4.
ai_fqdn
Nom de domaine complet de l’hôte.
ai_interfaceindex
Index d’interface, tel que défini par le IP_ADAPTER_ADDRESSES. Propriété IfIndex retournée dans GetAdaptersAddresses.
ai_resolutionhandle
Gérez le pointage vers le nom de domaine complet de l’hôte.
Remarques
La structure addrinfoex4 est prise en charge sur Windows 10 et Windows Server 2016
La structure addrinfoex4 est utilisée par la fonction GetAddrInfoEx pour contenir les informations d’adresse de l’hôte lorsque les AI_EXTENDED | AI_FQDN | AI_CANONNAME | bits AI_RESOLUTION_HANDLE sont définis dans le membre addrinfoex4.ai_flags transmis via getAddrInfoEx.paramètre hints .
La structure addrinfoex4 est une version améliorée de la structure addrinfoex qui peut retourner le nom canonique, le nom de domaine complet de l’hôte et un handle au nom de domaine complet. À son tour, GetAddrInfoEx est une version améliorée des structures addrinfo et addrinfoW utilisées avec les fonctions getaddrinfo et GetAddrInfoW . La fonction GetAddrInfoEx permet de spécifier le fournisseur d’espace de noms pour résoudre la requête. Pour une utilisation avec le protocole IPv6 et IPv4, la résolution de noms peut être effectuée par le dns (Domain Name System), un fichier d’hôtes local, un fournisseur de messagerie (l’espace de noms NS_EMAIL ) ou par d’autres mécanismes de nommage.
Les données blob dans tha ai_blob membre sont utilisées pour retourner des informations d’espace de noms supplémentaires spécifiques au fournisseur associées à un nom. Le format des données dans le membre ai_blob est spécifique à un fournisseur d’espace de noms particulier. Actuellement, les données d’objet blob sont utilisées par le fournisseur d’espace de noms NS_EMAIL pour fournir des informations supplémentaires.
Lorsque unicode ou _UNICODE est défini, addrinfoex4 est défini sur addrinfoex4W, la version Unicode de cette structure. Les paramètres de chaîne sont définis pour le type de données PWSTR et la structure addrinfoex4W est utilisée.
Lorsque UNICODE ou _UNICODE n’est pas défini, addrinfoex4 est défini sur addrinfoex4A, la version ANSI de cette structure. Les paramètres de chaîne sont du type de données char * et la structure addrinfoex4A est utilisée.
Lors d’un appel réussi à GetAddrInfoEx, une liste liée de structures addrinfoex4 est retournée dans le paramètre ppResult passé à la fonction GetAddrInfoEx . La liste peut être traitée en suivant le pointeur fourni dans le ai_next membre de chaque structure addrinfoex4 retournée jusqu’à ce qu’un pointeur NULL soit rencontré. Dans chaque structure addrinfoex4 retournée, les membres ai_family, ai_socktype et ai_protocol correspondent aux arguments respectifs dans un appel de fonction socket ou WSASocket . En outre, le membre ai_addr dans chaque structure addrinfoex4 retournée pointe vers une structure d’adresse de socket remplie, dont la longueur est spécifiée dans son ai_addrlen membre.
Exemples
Le code suivant décrit l’appel à GetAddrInfoEx avec une structure addrinfoex4 pour récupérer le handle sur un nom de domaine complet. l’exemple appelle ensuite WSAIoctl avec la structure 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;
}
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows 10 (applications de bureau uniquement) |
Serveur minimal pris en charge | Windows Server 2016 (applications de bureau uniquement) |
En-tête | ws2def.h |