Freigeben über


ADDRINFOEX4-Struktur (ws2def.h)

Die addrinfoex4-Struktur wird von der GetAddrInfoEx-Funktion verwendet, um Hostadresseninformationen aufzunehmen, wenn eine bestimmte Netzwerkschnittstelle angefordert wurde.

Syntax

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;

Member

ai_flags

Flags, die optionen angeben, die in der GetAddrInfoEx-Funktion verwendet werden.

Unterstützte Werte für das ai_flags-Member werden in der Winsock2.h-Includedatei definiert und können eine Kombination aus den folgenden Optionen sein.

Wert Bedeutung
AI_PASSIVE
0x01
Die Socketadresse wird in einem Aufruf der Bindungsfunktion verwendet.
AI_CANONNAME
0x02
Der kanonische Name wird im ersten ai_canonname Member zurückgegeben.
AI_NUMERICHOST
0x04
Der knotenname-Parameter , der an die GetAddrInfoEx-Funktion übergeben wird, muss eine numerische Zeichenfolge sein.
AI_ALL
0x0100
Wenn dieses Bit festgelegt ist, wird eine Anforderung für IPv6-Adressen und IPv4-Adressen mit AI_V4MAPPED gestellt.

Diese Option wird unter Windows Vista und höher unterstützt.

AI_ADDRCONFIG
0x0400
GetAddrInfoEx wird nur aufgelöst, wenn eine globale Adresse konfiguriert ist. Die IPv6- und IPv4-Loopbackadresse wird nicht als gültige globale Adresse betrachtet.

Diese Option wird unter Windows Vista und höher unterstützt.

AI_V4MAPPED
0x0800
Wenn bei der GetAddrInfoEx-Anforderung für eine IPv6-Adresse ein Fehler auftritt, wird eine Namensdienstanforderung für IPv4-Adressen erstellt, und diese Adressen werden in das IPv4-Adressformat konvertiert.

Diese Option wird unter Windows Vista und höher unterstützt.

AI_NON_AUTHORITATIVE
0x04000
Die Adressinformationen stammen aus nicht autorisierenden Ergebnissen.

Wenn diese Option im pHints-Parameter von GetAddrInfoEx festgelegt ist, gibt der NS_EMAIL-Namespaceanbieter sowohl autorisierende als auch nicht autorisierende Ergebnisse zurück. Wenn diese Option nicht festgelegt ist, werden nur autorisierende Ergebnisse zurückgegeben.

Diese Option wird nur unter Windows Vista und höher für den NS_EMAIL-Namespace unterstützt.

AI_SECURE
0x08000
Die Adressinformationen stammen aus einem sicheren Kanal.

Wenn das AI_SECURE Bit festgelegt ist, gibt der NS_EMAIL-Namespaceanbieter Ergebnisse zurück, die mit erhöhter Sicherheit abgerufen wurden, um mögliche Spoofings zu minimieren.

Wenn diese Option im pHints-Parameter von GetAddrInfoEx festgelegt ist, gibt der NS_EMAIL-Namespaceanbieter nur Ergebnisse zurück, die mit erhöhter Sicherheit abgerufen wurden, um mögliche Spoofing zu minimieren.

Diese Option wird nur unter Windows Vista und höher für den NS_EMAIL-Namespace unterstützt.

AI_RETURN_PREFERRED_NAMES
0x010000
Die Adressinformationen gelten für einen bevorzugten Namen für die Veröffentlichung mit einem bestimmten Namespace.

Wenn diese Option im pHints-Parameter von GetAddrInfoEx festgelegt ist, sollte kein Name im pName-Parameter angegeben werden, und der NS_EMAIL Namespaceanbieter gibt bevorzugte Namen für die Veröffentlichung zurück.

Diese Option wird nur unter Windows Vista und höher für den NS_EMAIL-Namespace unterstützt.

AI_FQDN
0x00020000
Der vollqualifizierte Domänenname wird im ersten ai_fqdn Member zurückgegeben.

Wenn diese Option im pHints-Parameter von GetAddrInfoEx festgelegt ist und im pName-Parameter ein flacher Name (einzelne Bezeichnung) angegeben wird, wird der vollqualifizierte Domänenname zurückgegeben, in den der Name schließlich aufgelöst wurde.

Diese Option wird unter Windows 7, Windows Server 2008 R2 und höher unterstützt.

AI_FILESERVER
0x00040000
Ein Hinweis an den Namespaceanbieter, dass der abgefragte Hostname in einem Dateifreigabeszenario verwendet wird. Dieser Hinweis kann vom Namespaceanbieter ignoriert werden.

Diese Option wird unter Windows 7, Windows Server 2008 R2 und höher unterstützt.

AI_DISABLE_IDN_ENCODING
0x00080000
Deaktivieren Sie die automatische internationale Domänennamencodierung mithilfe von Punycode in den Von der GetAddrInfoEx-Funktion aufgerufenen Namensauflösungsfunktionen.

Diese Option wird auf Windows 8, Windows Server 2012 und höher unterstützt.

AI_EXTENDED
0x80000000
Gibt an, dass das aktuelle Objekt erweitert wird, d. h. addrinfoex2 oder höher.

Diese Option wird auf Windows 8.1, Windows Server 2012 R2 und höher unterstützt.

AI_RESOLUTION_HANDLE
0x40000000
Im ai_resolutionhandle-Member wird ein Auflösungshandle zurückgegeben.

Diese Option wird auf Windows 10, Windows Server 2016 und höher unterstützt.

ai_family

Die Adressfamilie.

Die möglichen Werte für die Adressfamilie sind in der Headerdatei Ws2def.h definiert. Beachten Sie, dass die Ws2def.h-Headerdatei automatisch in Winsock2.h enthalten ist und nie direkt verwendet werden sollte.

Die derzeit unterstützten Werte sind AF_INET oder AF_INET6, d. h. die Internetadressenfamilienformate für IPv4 und IPv6. Andere Optionen für Adressfamilien (AF_NETBIOS für die Verwendung mit NetBIOS) werden unterstützt, wenn ein Windows Sockets-Dienstanbieter für die Adressfamilie installiert ist. Beachten Sie, dass die Werte für die AF_ Adressfamilie und PF_ Protokollfamilienkonstanten identisch sind (z. B. AF_INET und PF_INET), sodass beide Konstanten verwendet werden können.

In der folgenden Tabelle sind allgemeine Werte für die Adressfamilie aufgeführt, obwohl viele andere Werte möglich sind.

Wert Bedeutung
AF_UNSPEC
0
Die Adressfamilie ist nicht angegeben.
AF_INET
2
Die IPv4-Adressfamilie (Internet Protocol Version 4).
AF_NETBIOS
17
Die NetBIOS-Adressfamilie. Diese Adressfamilie wird nur unterstützt, wenn ein Windows Sockets-Anbieter für NetBIOS installiert ist.
AF_INET6
23
Die IPv6-Adressfamilie (Internet Protocol Version 6).
AF_IRDA
26
Die IrDA-Adressfamilie (Infrared Data Association). Diese Adressfamilie wird nur unterstützt, wenn auf dem Computer ein Infrarotport und ein Treiber installiert sind.
AF_BTH
32
Die Bluetooth-Adressfamilie. Diese Adressfamilie wird nur unterstützt, wenn ein Bluetooth-Adapter installiert ist.

ai_socktype

Der Sockettyp. Mögliche Werte für den Sockettyp sind in der Includedatei Winsock2.h definiert.

In der folgenden Tabelle sind die möglichen Werte für den für Windows Sockets 2 unterstützten Sockettyp aufgeführt:

Wert Bedeutung
SOCK_STREAM
1
Stellt sequenzierte, zuverlässige, bidirektionale, verbindungsbasierte Bytedatenströme mit einem OOB-Datenübertragungsmechanismus bereit. Verwendet tcp (Transmission Control Protocol) für die Internetadressenfamilie (AF_INET oder AF_INET6). Wenn der ai_family-MemberAF_IRDA ist, ist SOCK_STREAM der einzige unterstützte Sockettyp.
SOCK_DGRAM
2
Unterstützt Datagramme, bei denen es sich um verbindungslose, unzuverlässige Puffer mit fester (in der Regel kleiner) maximaler Länge handelt. Verwendet das User Datagram Protocol (UDP) für die Internetadressenfamilie (AF_INET oder AF_INET6).
SOCK_RAW
3
Stellt einen unformatierten Socket bereit, mit dem eine Anwendung den nächsten Protokollheader der oberen Ebene bearbeiten kann. Um den IPv4-Header zu bearbeiten, muss die Option IP_HDRINCL Socket für den Socket festgelegt werden. Um den IPv6-Header zu bearbeiten, muss die Option IPV6_HDRINCL Socket für den Socket festgelegt werden.
SOCK_RDM
4
Stellt ein zuverlässiges Nachrichten-Datagramm bereit. Ein Beispiel für diesen Typ ist die PGM-Multicastprotokollimplementierung (Pragmatic General Multicast) in Windows, die häufig als zuverlässige Multicastprogrammierung bezeichnet wird.
SOCK_SEQPACKET
5
Stellt ein Pseudostreampaket basierend auf Datagrammen bereit.
 

In Windows Sockets 2 wurden neue Sockettypen eingeführt. Eine Anwendung kann die Attribute jedes verfügbaren Transportprotokolls mithilfe der WSAEnumProtocols-Funktion dynamisch ermitteln. Daher kann eine Anwendung die möglichen Sockettyp- und Protokolloptionen für eine Adressfamilie ermitteln und diese Informationen beim Angeben dieses Parameters verwenden. Sockettypdefinitionen in den Headerdateien Winsock2.h und Ws2def.h werden regelmäßig aktualisiert, wenn neue Sockettypen, Adressfamilien und Protokolle definiert werden.

In Windows Sockets 1.1 sind die einzigen möglichen Sockettypen SOCK_DATAGRAM und SOCK_STREAM.

ai_protocol

Der Protokolltyp. Die möglichen Optionen sind spezifisch für die angegebene Adressfamilie und den angegebenen Sockettyp. Mögliche Werte für die ai_protocol sind in Winsock2.h und den Wsrm.h-Headerdateien definiert.

Auf der für Windows Vista und höher veröffentlichten Windows SDK wurde die organization der Headerdateien geändert, und dieser Member kann einer der Werte des IPPROTO-Enumerationstyps sein, der in der Ws2def.h-Headerdatei definiert ist. Beachten Sie, dass die Ws2def.h-Headerdatei automatisch in Winsock2.h enthalten ist und niemals direkt verwendet werden sollte.

Wenn für ai_protocol der Wert 0 angegeben wird, möchte der Aufrufer kein Protokoll angeben, und der Dienstanbieter wählt die zu verwendende ai_protocol aus. Legen Sie für andere Protokolle als IPv4 und IPv6 ai_protocol auf Null fest.

In der folgenden Tabelle sind allgemeine Werte für den ai_protocol-Member aufgeführt, obwohl viele andere Werte möglich sind.

Wert Bedeutung
IPPROTO_TCP
6
Das Tcp-Protokoll (Transmission Control Protocol). Dies ist ein möglicher Wert, wenn der ai_family-MemberAF_INET oder AF_INET6 ist und der ai_socktype-Member SOCK_STREAM wird.
IPPROTO_UDP
17
Das User Datagram Protocol (UDP). Dies ist ein möglicher Wert, wenn der ai_family-MemberAF_INET oder AF_INET6 und der TypparameterSOCK_DGRAM ist.
IPPROTO_RM
113
Das PGM-Protokoll für zuverlässiges Multicast. Dies ist ein möglicher Wert, wenn das ai_family-ElementAF_INET und das ai_socktype-Element SOCK_RDM wird. Auf der für Windows Vista und höher veröffentlichten Windows SDK wird dieser Wert auch als IPPROTO_PGM bezeichnet.
 

Wenn das ai_family-ElementAF_IRDA ist, muss die ai_protocol 0 sein.

ai_addrlen

Die Länge des Puffers in Bytes, auf den der ai_addr-Member verweist.

ai_canonname

Der kanonische Name für den Host.

ai_addr

Ein Zeiger auf eine sockaddr-Struktur . Der ai_addr-Member in jeder zurückgegebenen addrinfoex4-Struktur verweist auf eine ausgefüllte Socketadressstruktur. Die Länge jeder zurückgegebenen addrinfoex4-Struktur in Bytes wird im ai_addrlen-Member angegeben.

ai_blob

Ein Zeiger auf Daten, der verwendet wird, um anbieterspezifische Namespaceinformationen zurückzugeben, die dem Namen über eine Liste von Adressen hinaus zugeordnet sind. Die Länge des Puffers in Bytes, auf den ai_blob verweist, muss im ai_bloblen-Member angegeben werden.

ai_bloblen

Die Länge des ai_blob-Elements in Bytes.

ai_provider

Ein Zeiger auf die GUID eines bestimmten Namespaceanbieters.

ai_next

Ein Zeiger auf die nächste Struktur in einer verknüpften Liste. Dieser Parameter wird in der letzten addrinfoex4-Struktur einer verknüpften Liste auf NULL festgelegt.

ai_version

Die Versionsnummer dieser Struktur. Der derzeit für diese Version der -Struktur verwendete Wert ist 4.

ai_fqdn

Der vollqualifizierte Domänenname für den Host.

ai_interfaceindex

Der Schnittstellenindex, wie vom IP_ADAPTER_ADDRESSES definiert. IfIndex-Eigenschaft , die in GetAdaptersAddresses zurückgegeben wird.

ai_resolutionhandle

Handle, das auf den vollqualifizierten Domänennamen für den Host zeigt.

Hinweise

Die addrinfoex4-Struktur wird auf Windows 10 und Windows Server 2016 unterstützt.

Die addrinfoex4-Struktur wird von der GetAddrInfoEx-Funktion verwendet, um Hostadresseninformationen zu enthalten, wenn die AI_EXTENDED | AI_FQDN | AI_CANONNAME | AI_RESOLUTION_HANDLE Bits im element addrinfoex4.ai_flags festgelegt werden, das über GetAddrInfoEx übergeben wird.hinweists-Parameter.

Die addrinfoex4-Struktur ist eine erweiterte Version der addrinfoex-Struktur , die den kanonischen Namen, den vollqualifizierten Domänennamen für den Host und ein Handle für den vollqualifizierten Domänennamen zurückgeben kann. GetAddrInfoEx wiederum ist eine erweiterte Version der addrinfo- und addrinfoW-Strukturen, die mit den Funktionen getaddrinfo und GetAddrInfoW verwendet werden. Die GetAddrInfoEx-Funktion ermöglicht die Angabe des Namespaceanbieters zum Auflösen der Abfrage. Für die Verwendung mit dem IPv6- und IPv4-Protokoll kann die Namensauflösung durch das Domain Name System (DNS), eine lokale Hostdatei , einen E-Mail-Anbieter (der NS_EMAIL Namespace) oder durch andere Benennungsmechanismen erfolgen.

Die Blobdaten in der ai_blob Member werden verwendet, um zusätzliche anbieterspezifische Namespaceinformationen zurückzugeben, die einem Namen zugeordnet sind. Das Format der Daten im ai_blob-Member ist spezifisch für einen bestimmten Namespaceanbieter. Derzeit werden Blobdaten vom NS_EMAIL-Namespaceanbieter verwendet, um zusätzliche Informationen zur Verfügung zu stellen.

Wenn UNICODE oder _UNICODE definiert ist, wird addrinfoex4 für addrinfoex4W, die Unicode-Version dieser Struktur, definiert. Die Zeichenfolgenparameter werden für den PWSTR-Datentyp definiert, und die addrinfoex4W-Struktur wird verwendet.

Wenn UNICODE oder _UNICODE nicht definiert ist, wird addrinfoex4 für addrinfoex4A, die ANSI-Version dieser Struktur, definiert. Die Zeichenfolgenparameter haben den Datentyp char * und die addrinfoex4A-Struktur wird verwendet.

Nach einem erfolgreichen Aufruf von GetAddrInfoEx wird eine verknüpfte Liste von addrinfoex4-Strukturen im ppResult-Parameter zurückgegeben, der an die GetAddrInfoEx-Funktion übergeben wird. Die Liste kann verarbeitet werden, indem sie dem im ai_next-Member jeder zurückgegebenen addrinfoex4-Struktur angegebenen Zeiger folgen, bis ein NULL-Zeiger gefunden wird. In jeder zurückgegebenen addrinfoex4-Struktur entsprechen die elemente ai_family, ai_socktype und ai_protocol den entsprechenden Argumenten in einem Socket - oder WSASocket-Funktionsaufruf . Außerdem verweist der ai_addr Member in jeder zurückgegebenen addrinfoex4-Struktur auf eine ausgefüllte Socketadressstruktur, deren Länge im ai_addrlen-Element angegeben ist.

Beispiele

Der folgende Code beschreibt das Aufrufen von GetAddrInfoEx mit einer addrinfoex4-Struktur , um das Handle an einen FQDN abzurufen. Im Beispiel wird dann WSAIoctl mit der ASSOCIATE_NAMERES_CONTEXT_INPUT-Struktur aufgerufen.

// 
// 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; 
} 

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 10 [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2016 [nur Desktop-Apps]
Kopfzeile ws2def.h

Weitere Informationen

GetAddrInfoEx

addrinfo

addrinfoW

addrinfoex

addrinfoex3