ADDRINFOEX4 Struktur (ws2def.h)
Die addrinfoex4- Struktur wird von der GetAddrInfoEx--Funktion verwendet, um Hostadresseninformationen zu enthalten, 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;
Angehörige
ai_flags
Flags, die Optionen angeben, die in der GetAddrInfoEx--Funktion verwendet werden.
Unterstützte Werte für das ai_flags-Element werden in der Winsock2.h enthaltene Datei definiert und können eine Kombination der folgenden Optionen sein.
Wert | Bedeutung |
---|---|
|
Die Socketadresse wird in einem Aufruf der Bindung Funktion verwendet. |
|
Der kanonische Name wird im ersten ai_canonname-Element zurückgegeben. |
|
Der Knotenname Parameter, der an die GetAddrInfoEx- funktion übergeben wird, muss eine numerische Zeichenfolge sein. |
|
Wenn dieses Bit festgelegt ist, wird eine Anforderung für IPv6-Adressen und IPv4-Adressen mit AI_V4MAPPEDgestellt.
Diese Option wird unter Windows Vista und höher unterstützt. |
|
Die GetAddrInfoEx- wird nur aufgelöst, wenn eine globale Adresse konfiguriert ist. Die IPv6- und IPv4-Loopbackadresse gilt nicht als gültige globale Adresse.
Diese Option wird unter Windows Vista und höher unterstützt. |
|
Wenn die GetAddrInfoEx- Anforderung für IPv6-Adressen fehlschlägt, wird eine Namensdienstanforderung für IPv4-Adressen gestellt, und diese Adressen werden in das IPv4-zugeordnete IPv6-Adressformat konvertiert.
Diese Option wird unter Windows Vista und höher unterstützt. |
|
Die Adressinformationen stammen aus nicht autoritativen Ergebnissen.
Wenn diese Option im pHints Parameter von GetAddrInfoExfestgelegt wird, 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. |
|
Die Adressinformationen stammen aus einem sicheren Kanal.
Wenn das AI_SECURE Bit festgelegt ist, gibt der NS_EMAIL Namespaceanbieter Ergebnisse zurück, die mit verbesserter Sicherheit abgerufen wurden, um mögliche Spoofing zu minimieren. Wenn diese Option im pHints Parameter von GetAddrInfoExfestgelegt wird, gibt der NS_EMAIL Namespaceanbieter nur Ergebnisse zurück, die mit erweiterter 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. |
|
Die Adressinformationen beziehen sich auf bevorzugte Namen für die Publikation mit einem bestimmten Namespace.
Wenn diese Option im pHints Parameter von GetAddrInfoExfestgelegt wird, sollte kein Name im pName--Parameter angegeben werden, und der NS_EMAIL Namespaceanbieter gibt bevorzugte Namen für die Publikation zurück. Diese Option wird nur unter Windows Vista und höher für den NS_EMAIL Namespace unterstützt. |
|
Der vollqualifizierte Domänenname wird im ersten ai_fqdn Mitglied zurückgegeben.
Wenn diese Option im pHints Parameter von GetAddrInfoEx und im pName Parameter ein Flachname (einzelne Bezeichnung) angegeben wird, wird der vollqualifizierte Domänenname zurückgegeben, zu dem der Name schließlich aufgelöst wird. Diese Option wird unter Windows 7, Windows Server 2008 R2 und höher unterstützt. |
|
Ein Hinweis auf den Namespaceanbieter, der abgefragt wird, wird in einem Dateifreigabeszenario verwendet. Dieser Hinweis kann vom Namespaceanbieter ignoriert werden.
Diese Option wird unter Windows 7, Windows Server 2008 R2 und höher unterstützt. |
|
Deaktivieren Sie die automatische Codierung des internationalen Domänennamens mithilfe von Punycode in den Namensauflösungsfunktionen, die von der GetAddrInfoEx--Funktion aufgerufen werden.
Diese Option wird unter Windows 8, Windows Server 2012 und höher unterstützt. |
|
Gibt an, dass das aktuelle Objekt erweitert wird: d. h. ein addrinfoex2 oder höher.
Diese Option wird unter Windows 8.1, Windows Server 2012 R2 und höher unterstützt. |
|
Ein Lösungshandle wird im ai_resolutionhandle Member zurückgegeben.
Diese Option wird unter Windows 10, Windows Server 2016 und höher unterstützt. |
ai_family
Die Adressfamilie.
Die möglichen Werte für die Adressfamilie werden in der Ws2def.h Headerdatei definiert. Beachten Sie, dass die Ws2def.h Headerdatei automatisch in Winsock2.henthalten ist und niemals direkt verwendet werden sollte.
Die derzeit unterstützten Werte werden AF_INET oder AF_INET6, die internetadressfamilienformate für IPv4 und IPv6 sind. Andere Optionen für Adressfamilie (AF_NETBIOS für die Verwendung mit NetBIOS, z. B.), 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.
ai_socktype
Der Sockettyp. Mögliche Werte für den Sockettyp werden in der Winsock2.h enthaltene Datei 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 |
---|---|
|
Stellt sequenzierte, zuverlässige, bidirektionale, verbindungsbasierte Bytestreams mit einem OOB-Datenübertragungsmechanismus bereit. Verwendet das Transmission Control Protocol (TCP) für die Internetadressenfamilie (AF_INET oder AF_INET6). Wenn das ai_family Mitglied AF_IRDAist, ist SOCK_STREAM der einzige unterstützte Sockettyp. |
|
Unterstützt Datagramme, die verbindungslose, unzuverlässige Puffer einer festen (normalerweise kleinen) maximalen Länge sind. Verwendet das User Datagram Protocol (UDP) für die Internetadressenfamilie (AF_INET oder AF_INET6). |
|
Stellt einen unformatierten Socket bereit, der es einer Anwendung ermöglicht, den nächsten Protokollheader der oberen Ebene zu bearbeiten. Um den IPv4-Header zu bearbeiten, muss die IP_HDRINCL Socketoption für den Socket festgelegt werden. Um den IPv6-Header zu bearbeiten, muss die IPV6_HDRINCL Socketoption für den Socket festgelegt werden. |
|
Stellt ein zuverlässiges Nachrichtendatendiagramm bereit. Ein Beispiel für diesen Typ ist die Pragmatische Multicast-Multicast(PGM)-Multicastprotokollimplementierung in Windows, die häufig als zuverlässige Multicastprogrammierungbezeichnet wird. |
|
Stellt ein Pseudodatenstrompaket basierend auf Datagrammen bereit. |
In Windows Sockets 2 wurden neue Sockettypen eingeführt. Eine Anwendung kann die Attribute jedes verfügbaren Transportprotokolls dynamisch über die WSAEnumProtocols-Funktion ermitteln. Daher kann eine Anwendung die möglichen Sockettyp- und Protokolloptionen für eine Adressfamilie bestimmen und diese Informationen verwenden, wenn Sie diesen Parameter angeben. Sockettypdefinitionen in der Winsock2.h und Ws2def.h Headerdateien werden regelmäßig aktualisiert, wenn neue Sockettypen, Adressfamilien und Protokolle definiert sind.
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 werden in Winsock2.h und den Wsrm.h Headerdateien definiert.
Im windows SDK, das für Windows Vista und höher veröffentlicht wurde, hat sich die Organisation von Headerdateien geändert, und dieses Mitglied kann einer der Werte aus dem IPPROTO- Enumerationstyp sein, der in der Ws2def.h Headerdatei definiert ist. Beachten Sie, dass die Ws2def.h Headerdatei automatisch in Winsock2.henthalten ist und niemals direkt verwendet werden sollte.
Wenn für ai_protocolein Wert von 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 das ai_protocol-Element aufgeführt, obwohl viele andere Werte möglich sind.
Wenn das ai_family Mitglied AF_IRDAist, muss die ai_protocol 0 sein.
ai_addrlen
Die Länge des Puffers in Byte, auf den das ai_addr-Element verweist.
ai_canonname
Der kanonische Name für den Host.
ai_addr
Ein Zeiger auf eine sockaddr- Struktur. Das ai_addr Element in jedem zurückgegebenen addrinfoex4 Struktur verweist auf eine gefüllte Socketadressenstruktur. Die Länge jedes zurückgegebenen addrinfoex4- Struktur in Byte wird im ai_addrlen-Element angegeben.
ai_blob
Ein Zeiger auf Daten, die verwendet werden, um anbieterspezifische Namespaceinformationen zurückzugeben, die dem Namen über eine Liste von Adressen hinaus zugeordnet sind. Die Länge des puffers, auf den ai_blob verweist, muss im ai_bloblen-Element angegeben werden.
ai_bloblen
Die Länge des ai_blob Elements in Byte.
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 auf NULL- in der letzten addrinfoex4 Struktur einer verknüpften Liste festgelegt.
ai_version
Die Versionsnummer dieser Struktur. Der aktuell 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_ADDRESSESdefiniert.IfIndex-Eigenschaft, die in GetAdaptersAddresseszurückgegeben wird.
ai_resolutionhandle
Behandeln Sie das Verweisen auf den vollqualifizierten Domänennamen für den Host.
Bemerkungen
Die addrinfoex4 Struktur wird unter 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 addrinfoex4.ai_flags Member festgelegt werden, das über die GetAddrInfoEx-übergeben wird.Hinweise Parameter.
Die addrinfoex4--Struktur ist eine verbesserte 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- ist wiederum 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 Hosts Datei, einen E-Mail-Anbieter (den NS_EMAIL Namespace) oder durch andere Benennungsmechanismen erfolgen.
Die BLOB-Daten in tha 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 BLOB-Daten vom NS_EMAIL Namespaceanbieter verwendet, um zusätzliche Informationen zu liefern.
Wenn UNICODE oder _UNICODE definiert ist, wird addrinfoex4 für addrinfoex4Wdefiniert, die Unicode-Version dieser Struktur. 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-definiert, die ANSI-Version dieser Struktur. Die Zeichenfolgenparameter sind der Zeichen * Datentyp, und die addrinfoex4A Struktur wird verwendet.
Bei einem erfolgreichen Aufruf von GetAddrInfoExwird eine verknüpfte Liste der 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 jedes zurückgegebenen addrinfoex4- Struktur folgt, bis ein NULL- Zeiger gefunden wird. In jeder zurückgegebenen addrinfoex4--Struktur entsprechen die ai_family, ai_socktypeund ai_protocol Member den entsprechenden Argumenten in einem Socket oder WSASocket Funktionsaufruf. Außerdem verweist das ai_addr Element in jedem zurückgegebenen addrinfoex4 Struktur auf eine gefüllte Socketadressenstruktur, deren Länge in seinem ai_addrlen Element angegeben ist.
Beispiele
Der folgende Code beschreibt, dass ein Aufruf von GetAddrInfoEx mit einer addrinfoex4--Struktur zum Abrufen des Handles an einen FQDN erfolgt. anschließend rufen Sie WSAIoctl- mit der ASSOCIATE_NAMERES_CONTEXT_INPUT-Struktur auf.
//
// 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 |
---|---|
mindestens unterstützte Client- | Windows 10 [nur Desktop-Apps] |
mindestens unterstützte Server- | Windows Server 2016 [nur Desktop-Apps] |
Header- | ws2def.h |