GetAddrInfoW 函式 (ws2tcpip.h)
GetAddrInfoW函式提供從 Unicode 主機名稱到位址的通訊協定獨立轉譯。
語法
INT WSAAPI GetAddrInfoW(
[in, optional] PCWSTR pNodeName,
[in, optional] PCWSTR pServiceName,
[in, optional] const ADDRINFOW *pHints,
[out] PADDRINFOW *ppResult
);
參數
[in, optional] pNodeName
Null終止 Unicode 字串的指標,其中包含主機 (節點) 名稱或數值主機位址字串。 對於網際網路通訊協定,數值主機位址字串是虛線十進位 IPv4 位址或 IPv6 十六進位位址。
[in, optional] pServiceName
Null終止 Unicode 字串的指標,其中包含以字串表示的服務名稱或埠號碼。
服務名稱是埠號碼的字串別名。 例如,「HTTP」 是網際網路工程工作組 (IETF 所定義的埠 80 別名,) 做為 Web 服務器用於 HTTP 通訊協定的預設埠。 未指定埠號碼時 ,pServiceName 參數的可能值會列在下列檔案中:
%WINDIR%\system32\drivers\etc\services
[in, optional] pHints
addrinfoW結構的指標,提供呼叫端支援的通訊端類型提示。
pHints參數所指向之addrinfoW結構的ai_addrlen、ai_canonname、ai_addr和ai_next成員必須是零或Null。 否則 GetAddrInfoEx 函式將會失敗,並 WSANO_RECOVERY。
如需詳細資訊,請參閱。
[out] ppResult
一或多個 addrinfoW 結構連結清單的指標,其中包含主機的回應資訊。
傳回值
成功傳回零。 失敗會傳回非零的 Windows Sockets 錯誤碼,如 Windows 通訊端錯誤碼中所找到。
GetAddrInfoW函式傳回的大部分非零錯誤碼都會對應至 Internet Engineering Task Force (IETF 所概述的錯誤集) 建議。 下表列出這些錯誤碼及其 WSA 對等專案。 建議使用 WSA 錯誤碼,因為它們為 Winsock 程式設計人員提供熟悉且完整的錯誤資訊。
錯誤值 | WSA 對等專案 | 描述 |
---|---|---|
EAI_AGAIN | WSATRY_AGAIN | 發生名稱解析的暫時失敗。 |
EAI_BADFLAGS | WSAEINVAL | 為pHints參數ai_flags成員提供不正確值。 |
EAI_FAIL | WSANO_RECOVERY | 發生無法復原的名稱解析失敗。 |
EAI_FAMILY | WSAEAFNOSUPPORT | 不支援pHints參數ai_family成員。 |
EAI_MEMORY | WSA_NOT_ENOUGH_MEMORY | 發生記憶體配置失敗。 |
EAI_NONAME | WSAHOST_NOT_FOUND | 未針對提供的參數解析名稱,或未提供 pNodeName 和 pServiceName 參數。 |
EAI_SERVICE | WSATYPE_NOT_FOUND | pServiceName參數不支援pHints參數的指定ai_socktype成員。 |
EAI_SOCKTYPE | WSAESOCKTNOSUPPORT | 不支援pHints參數ai_socktype成員。 |
使用 gai_strerror 函式,根據 GetAddrInfoW 函式傳回的EAI_* 代碼來列印錯誤訊息。 提供gai_strerror函式以符合 IETF 建議,但不是安全線程。 因此,建議使用傳統 Windows Sockets 函式,例如 WSAGetLastError。
錯誤碼 | 意義 |
---|---|
記憶體不足,無法執行作業。 | |
已使用與要求通訊協定不相容的位址。 如果不支援hints參數所指向的 addrinfoW結構ai_family成員,就會傳回此錯誤。 | |
提供的引數無效。 如果為hints參數所指向之addrinfoW結構ai_flags成員提供不正確值,就會傳回此錯誤。 | |
這個地址家族中不存在對指定通訊端類型的支援。 如果不支援 hints參數所指向的addrinfoW結構ai_socktype成員,就會傳回此錯誤。 | |
沒有已知的此類主機。 如果未針對提供的參數解析名稱,或未提供 pNodename 和 pServicename 參數,則會傳回此錯誤。 | |
要求的名稱有效,但找不到所要求類型的資料。 | |
資料庫尋查期間發生無法復原的錯誤。 如果發生名稱解析中無法復原的錯誤,就會傳回此錯誤。 | |
使用此函式之前,必須先進行成功的 WSAStartup 呼叫。 | |
這通常為主機名稱解析期間的暫時錯誤,表示本機伺服器未收到授權伺服器的回應。 發生名稱解析暫時失敗時,就會傳回此錯誤。 | |
找不到指定的類別。 hints參數所指向之 addrinfoW結構的指定ai_socktype成員不支援pServiceName參數。 |
備註
GetAddrInfoW函式是一個函式的 Unicode 版本,可提供從主機名稱到位址的通訊協定獨立轉譯。 此函式的 ANSI 版本是 getaddrinfo。
GetAddrInfoW函式會傳回NS_DNS命名空間的結果。 如果有多個命名空間提供者傳回信息, GetAddrInfoW 函式會匯總所有回應。 若要搭配 IPv6 和 IPv4 通訊協定使用,名稱解析可以透過網域名稱系統 (DNS) 、本機 主機 檔案,或 NS_DNS 命名空間的其他命名機制使用。
Winsock 標頭檔中的宏會定義 GetAddrInfo 和 ADDRINFOT 結構的混合大小寫函式名稱。 這個GetAddrInfo函式應該使用TCHAR型別指標的pNodeName和pServiceName參數呼叫,以及ADDRINFOT型別指標的pHints和ppResult參數。 定義 UNICODE 或_UNICODE時, GetAddrInfo 會定義為 GetAddrInfoW、函式的 Unicode 版本,而 ADDRINFOT 會定義至 addrinfoW 結構。 未定義 UNICODE 或_UNICODE時, GetAddrInfo 會定義為 getaddrinfo、函式的 ANSI 版本,而 ADDRINFOT 會定義至 addrinfo 結構。
pNodeName或pServiceName參數的一或兩者都必須指向Null終止的 Unicode 字串;通常會提供這兩者。
成功時,ppResult參數會傳回addrinfoW結構的連結清單。 您可以依照每個傳回addrinfoW結構之ai_next成員中提供的指標來處理清單,直到遇到Null指標為止。 在每個傳回 的 addrinfoW 結構中, ai_family、 ai_socktype和 ai_protocol 成員會對應到 通訊端 或 WSASocket 函式呼叫中的個別引數。 此外,每個傳回addrinfoW結構中的ai_addr成員會指向填入的通訊端位址結構,其ai_addrlen成員中指定的長度。
如果 pNodeName 參數指向電腦名稱稱,則會傳回可用來做為來源位址的電腦的所有永久位址。 在 Windows Vista 和更新版本上,這些位址會包含 GetUnicastIpAddressTable 或 GetUnicastIpAddressEntry 函式傳回的所有單播 IP 位址, 其中 SkipAsSource 成員在 MIB_UNICASTIPADDRESS_ROW 結構中設定為 false。
如果 pNodeName 參數指向等於 「localhost」 的字串,則會傳回本機電腦上的所有回送位址。
如果 pNodeName 參數包含空字串,則會傳回本機電腦上所有已註冊的位址。
如果 pNodeName 參數指向等於 「. 的字串,則為 Windows Server 2003 和更新版本。localmachine「,會傳回本機電腦上所有已註冊的位址。
如果 pNodeName 參數參考叢集虛擬伺服器名稱,則只會傳回虛擬伺服器位址。 在 Windows Vista 和更新版本上,這些位址會包含 GetUnicastIpAddressTable 或 GetUnicastIpAddressEntry 函式傳回的所有單播 IP 位址,其中 SkipAsSource 成員在 MIB_UNICASTIPADDRESS_ROW 結構中設定為 true。 如需叢 集的詳細資訊,請參閱 Windows 叢 集。
Windows 7 Service Pack 1 (SP1) 和 Windows Server 2008 R2 service Pack 1 (SP1) 新增支援 Netsh.exe,以在 IP 位址上設定 SkipAsSource 屬性。 這也會變更行為,如此一來,如果MIB_UNICASTIPADDRESS_ROW結構中的SkipAsSource成員設定為 false,則會在 DNS 中註冊 IP 位址。 如果 SkipAsSource 成員設定為 true,則不會在 DNS 中註冊 IP 位址。
Hotfix 適用于 Windows 7 和 Windows Server 2008 R2,可新增對 Netsh.exe 的支援,以在 IP 位址上設定 SkipAsSource 屬性。 此 Hotfix 也會變更行為,如此一來,如果MIB_UNICASTIPADDRESS_ROW結構中的SkipAsSource成員設定為 false,則會在 DNS 中註冊 IP 位址。 如果 SkipAsSource 成員設定為 true,則不會在 DNS 中註冊 IP 位址。 如需詳細資訊,請參閱 知識庫 (KB) 2386184。
Windows Vista Service Pack 2 (SP2) 和 Windows Server 2008 Service Pack 2 (SP2) 也提供類似的 Hotfix,可新增對 Netsh.exe 的支援,以在 IP 位址上設定 SkipAsSource 屬性。 此 Hotfix 也會變更行為,如此一來,如果MIB_UNICASTIPADDRESS_ROW結構中的SkipAsSource成員設定為 false,則會在 DNS 中註冊 IP 位址。 如果 SkipAsSource 成員設定為 true,則不會在 DNS 中註冊 IP 位址。
GetAddrInfoW函式的呼叫端可以提供pHints參數所指向之 addrinfoW結構所支援的通訊端類型提示。 使用 pHints 參數時,下列規則會套用至其相關聯的 addrinfoW 結構:
- ai_family的AF_UNSPEC值表示呼叫端只會接受AF_INET和AF_INET6位址系列。 請注意, AF_UNSPEC 和 PF_UNSPEC 相同。
- ai_socktype的值為零,表示呼叫端將接受任何通訊端類型。
- ai_protocol的值為零,表示呼叫端將接受任何通訊協定。
- ai_addrlen成員必須設定為零。
- ai_canonname成員必須設定為Null。
- ai_addr成員必須設定為Null。
- ai_next成員必須設定為Null。
pHints參數中提供的addrinfoW結構中的其他值表示特定需求。 例如,如果呼叫端只處理 IPv4 且未處理 IPv6, 則ai_family 成員應該設定為 AF_INET。 另一個範例是,如果呼叫端只處理 TCP 且未處理 UDP, 則ai_socktype 成員應設定為 SOCK_STREAM。
如果pHints參數是Null指標,GetAddrInfoW函式會處理它,就像pHints中的addrinfoW結構已初始化,並將其ai_family成員設定為AF_UNSPEC,而所有其他成員都設定為零。
在 Windows Vista 和更新版本上,從服務呼叫 GetAddrInfoW 時,如果作業是呼叫服務的使用者進程結果,則服務應該模擬使用者。 這是為了允許正確強制執行安全性。
GetAddrInfoW函式可用來將 IP 位址的文字字串表示轉換為addrinfoW結構,其中包含 IP 位址的sockaddr結構和其他資訊。 若要以此方式使用,pNodeName參數指向的字串必須包含 IP 位址的文字表示,而pHints參數指向的addrinfoW結構必須設定ai_flags成員中的AI_NUMERICHOST旗標。 pNodeName參數指向的字串可能包含 IPv4 或 IPv6 位址的文字表示。 文字 IP 位址會轉換成ppResult參數所指向的addrinfoW結構。 傳回的 addrinfoW 結構包含 IP 位址的 sockaddr 結構,以及 IP 位址的其他資訊。 若要讓此方法在 Windows Server 2003 和 Windows XP 上使用 IPv6 位址字串,IPv6 通訊協定必須安裝在本機電腦上。 否則會傳回 WSAHOST_NOT_FOUND 錯誤。
從動態配置釋放位址資訊
會動態配置ppResult參數所指向之 GetAddrInfoW函式所傳回的所有資訊,包括addrinfoW結構、通訊端位址結構,以及addrinfoW結構所指向的正式主機名稱字串。 成功呼叫此函式所配置的記憶體必須釋放,且後續呼叫 FreeAddrInfoW。範例程式碼
下列程式碼範例示範如何使用 GetAddrInfoW 函式。#ifndef UNICODE
#define UNICODE
#endif
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
// set APPVER=5.02 for WinXP SP2 and later
int __cdecl wmain(int argc, wchar_t **argv)
{
//-----------------------------------------
// Declare and initialize variables
WSADATA wsaData;
int iResult;
INT iRetval;
DWORD dwRetval;
int i = 1;
ADDRINFOW *result = NULL;
ADDRINFOW *ptr = NULL;
ADDRINFOW hints;
// struct sockaddr_in6 *sockaddr_ipv6;
LPSOCKADDR sockaddr_ip;
wchar_t ipstringbuffer[46];
DWORD ipbufferlength = 46;
// Validate the parameters
if (argc != 3) {
wprintf(L"usage: %ws <hostname> <servicename>\n", argv[0]);
wprintf(L"getaddrinfow provides protocol-independent translation\n");
wprintf(L" from an Unicode 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 getaddrinfo() function
ZeroMemory( &hints, sizeof(hints) );
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
wprintf(L"Calling getaddrinfow with following parameters:\n");
wprintf(L"\tnodename = %ws\n", argv[1]);
wprintf(L"\tservname (or port) = %ws\n\n", argv[2]);
//--------------------------------
// Call GetAddrinfoW(). If the call succeeds,
// the result variable will hold a linked list
// of addrinfow structures containing response
// information
dwRetval = GetAddrInfoW(argv[1], argv[2], &hints, &result);
if ( dwRetval != 0 ) {
wprintf(L"GetAddrInfoW failed with error: %d\n", dwRetval);
WSACleanup();
return 1;
}
wprintf(L"GetAddrInfoW returned success\n");
// Retrieve each address and print out the hex bytes
for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {
wprintf(L"GetAddrInfoW 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");
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;
// printf("\tIPv6 address %s\n",
// InetNtop(AF_INET6, &sockaddr_ipv6->sin6_addr, ipstringbuffer, 46) );
// We use WSAAddressToString since it is supported on Windows XP and later
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);
}
FreeAddrInfoW(result);
WSACleanup();
return 0;
}
國際化功能變數名稱
網際網路主機名稱通常包含一組非常受限的字元:- 大寫和小寫的英文 ASCII 字母。
- 0 到 9 位數。
- ASCII 連字號字元。
隨著網際網路的成長,需要識別非 ASCII 字元集所代表之其他語言的網際網路主機名稱。 有助於此需求的識別碼,並允許非 ASCII 字元 (Unicode) 表示為特殊 ASCII 字元字串,稱為國際功能變數名稱 (IDN) 。 在應用程式 (IDNA) 中稱為國際化功能變數名稱的機制,可用來以標準方式處理 IDN。 IDN 和 IDNA 的規格記載于 INTERNET Engineering Task Force (IETF) 所發佈的 RFC 3490、 RTF 5890和 RFC 6365 中。
在 Windows 8 和 Windows Server 2012 上, GetAddrInfoW 函式支援國際化功能變數名稱 (IDN) 剖析套用至 pNodeName 參數中傳遞的名稱。 Winsock 會執行 Punycode/IDN 編碼和轉換。 您可以使用下面討論的 AI_DISABLE_IDN_ENCODING 旗標來停用此行為。
在 Windows 7 和 Windows Server 2008 R2 或更早版本上, GetAddrInfoW 函式目前不支援套用至 pNodeName 參數中所傳遞名稱的 IDN 剖析。 Winsock 不會執行任何 Punycode/IDN 轉換。 GetAddrInfoW函式不會使用 Punycode 根據RFC 3490轉換 IDN。 查詢 DNS 時 ,GetAddrInfoW 函式會以 UTF-8 格式編碼 Unicode 名稱,這是企業環境中 Microsoft DNS 伺服器所使用的格式。
Windows Vista 和更新版本的數個函式支援在 IDN 中的 Unicode 標籤與其 ASCII 對等專案之間的轉換。 每個 Unicode 標籤的結果表示只包含 ASCII 字元,如果 Unicode 標籤包含任何非 ASCII 字元,則開頭為 xn-- 前置詞。 這是因為支援網際網路上現有的 DNS 伺服器,因為某些 DNS 工具和伺服器僅支援 ASCII 字元 (請參閱 RFC 3490) 。
IdnToAscii函式會使用 Punycode,使用RFC 3490中定義的標準演算法,將 IDN 轉換為原始 Unicode 字串的 ASCII 標記法。 IdnToUnicode函式會將 IDN 的 ASCII 形式轉換成一般 Unicode UTF-16 編碼語法。 如需相關草稿標準的詳細資訊和連結,請參閱 處理國際化功能變數名稱 (IDN) 。
IdnToAscii函式可用來將 IDN 名稱轉換為 ASCII 表單。 若要將此 ASCII 表單傳遞至 GetAddrInfoW 函式,您可以使用 MultiByteToWideChar 函式將 CHAR 字串轉換成 WCHAR 字串,然後將 pNodeName 參數中傳遞至 GetAddrInfoW 函式。
在 hints 參數中使用ai_flags
pHints參數中提供之選擇性addrinfoW結構ai_flags成員中的旗標會修改函式的行為。
這些旗標位定義在適用于 Windows 7 的 Microsoft Windows 軟體發展工具組 (SDK) Ws2def.h 標頭檔中。 這些旗標位定義于 Windows SDK for Windows Server 2008 和 Windows Vista 上的 Ws2tcpip.h 標頭檔中。 這些旗標位定義于適用于 Windows Server 2003 和 Windows XP 的 Platform Software Development Kit (SDK) Ws2tcpip.h 標頭檔中。
旗標位可以是下列各項的組合:
標幟位 | 描述 |
---|---|
AI_PASSIVE |
設定 AI_PASSIVE 旗標表示呼叫端想要在系 結 函式的呼叫中使用傳回的通訊端位址結構。 當 設定 AI_PASSIVE 旗標且 pNodeName 是 Null 指標時,通訊端位址結構的 IP 位址部分會設定為 IPv4 位址 INADDR_ANY, 而 IPv6 位址IN6ADDR_ANY_INIT。
未設定AI_PASSIVE旗標時,傳回的通訊端位址結構已準備好呼叫連線導向通訊協定的connect函式,或準備好呼叫連線、傳送或傳送無連線通訊協定的函式。 在此情況下,如果 pNodeName 參數是 Null 指標,通訊端位址結構的 IP 位址部分會設定為回送位址。 |
AI_CANONNAME |
如果未使用 AI_CANONNAME 或 AI_NUMERICHOST , GetAddrInfoW 函式會嘗試解析。 如果傳遞常值字串 GetAddrInfoW 會嘗試轉換字串,而且如果傳遞主機名稱, GetAddrInfoW 函式會嘗試將名稱解析為位址或多個位址。
設定 AI_CANONNAME 位時, pNodeName 參數不能是 Null。 否則 GetAddrInfoEx 函式將會 失敗,並WSANO_RECOVERY。 當設定AI_CANONNAME位且GetAddrInfoW函式傳回成功時,ppResult參數中的ai_canonname成員會指向包含指定節點標準名稱的Null終止字串。 注意GetAddrInfoW函式可以在設定AI_CANONNAME旗標時傳回成功,但相關聯addrinfoW結構中的ai_canonname成員為Null。 因此,建議使用AI_CANONNAME旗標包括測試相關聯addrinfoW結構中的ai_canonname成員是否為Null。
|
AI_NUMERICHOST | 設定 AI_NUMERICHOST 位時, pNodeName 參數必須包含非Null 數值主機位址字串,否則會傳回 EAI_NONAME 錯誤。 此旗標可防止呼叫名稱解析服務。 |
AI_NUMERICSERV |
設定 AI_NUMERICSERV 位時, pServiceName 參數必須包含非Null 數值埠號碼,否則會傳回 EAI_NONAME 錯誤。 此旗標可防止呼叫名稱解析服務。
AI_NUMERICSERV旗標是在 Windows SDK for Windows Vista 和更新版本上定義。 Microsoft 提供者不支援 AI_NUMERICSERV 旗標。 |
AI_ALL |
如果設定 AI_ALL 位,則會針對具有 AI_V4MAPPED的 IPv6 位址和 IPv4 位址提出要求。
AI_ALL旗標是在 Windows SDK for Windows Vista 和更新版本上定義。 Windows Vista 和更新版本支援 AI_ALL 旗標。 |
AI_ADDRCONFIG |
如果 已設定AI_ADDRCONFIG 位,則只有在設定全域位址時 ,GetAddrInfoW 才會解析。 如果指定 了AI_ADDRCONFIG 旗標,則只有在本機系統上設定 IPv4 位址時,才會傳回 IPv4 位址,而且只有在本機系統上設定 IPv6 位址時,才會傳回 IPv6 位址。 IPv4 或 IPv6 回送位址不會被視為有效的全域位址。
AI_ADDRCONFIG旗標是在 Windows SDK for Windows Vista 和更新版本上定義。 Windows Vista 和更新版本支援 AI_ADDRCONFIG 旗標。 |
AI_V4MAPPED |
如果 已設定AI_V4MAPPED 位,且 IPv6 位址的要求失敗,則會對 IPv4 位址提出名稱服務要求,而且這些位址會轉換成 IPv4 對應 IPv6 位址格式。
AI_V4MAPPED旗標是在 Windows SDK for Windows Vista 和更新版本上定義。 Windows Vista 和更新版本支援 AI_V4MAPPED 旗標。 |
AI_NON_AUTHORITATIVE |
如果 已設定AI_NON_AUTHORITATIVE 位, 則NS_EMAIL 命名空間提供者會同時傳回授權和非授權結果。 如果未設定 AI_NON_AUTHORITATIVE 位, 則NS_EMAIL 命名空間提供者只會傳回授權結果。
AI_NON_AUTHORITATIVE旗標是在 Windows SDK for Windows Vista 和更新版本上定義。 Windows Vista 和更新版本支援 AI_NON_AUTHORITATIVE 旗標,並僅適用于 NS_EMAIL 命名空間。 |
AI_SECURE |
如果 已設定AI_SECURE 位, NS_EMAIL 命名空間提供者會傳回以增強安全性取得的結果,以將可能的詐騙降到最低。
AI_SECURE旗標是在 Windows SDK for Windows Vista 和更新版本上定義。 Windows Vista 和更新版本支援 AI_SECURE 旗標,僅適用于 NS_EMAIL 命名空間。 |
AI_RETURN_PREFERRED_NAMES |
如果 已設定AI_RETURN_PREFERRED_NAMES ,則 pNodeName 參數中不應該提供任何名稱。 NS_EMAIL命名空間提供者會傳回發行集的慣用名稱。
AI_RETURN_PREFERRED_NAMES旗標是在 Windows SDK for Windows Vista 和更新版本上定義。 Windows Vista 和更新版本支援 AI_RETURN_PREFERRED_NAMES 旗標,僅適用于 NS_EMAIL 命名空間。 |
AI_FQDN |
如果 已設定AI_FQDN ,且指定單一標籤 (單一標籤) , GetAddrInfoW 將會傳回最終解析名稱的完整功能變數名稱。 完整功能變數名稱會在相關聯的addrinfoW結構中的ai_canonname成員中傳回。 這與傳回 DNS 中註冊標準名稱的 AI_CANONNAME 位旗標不同,可能與一般名稱解析為的完整功能變數名稱不同。 只能設定其中一個 AI_FQDN 和 AI_CANONNAME 位。 如果兩個旗標都出現EAI_BADFLAGS,GetAddrInfoW函式將會失敗。
設定 AI_FQDN 位時, pNodeName 參數不能是 Null。 否則 GetAddrInfoEx 函式將會失敗,並 WSANO_RECOVERY。 Windows 7:AI_FQDN旗標是在 Windows SDK for Windows 7 和更新版本上定義。 Windows 7 和更新版本支援 AI_FQDN 旗標。 |
AI_FILESERVER |
如果 已設定AI_FILESERVER ,這是要查詢的主機名稱用於檔案共用案例的命名空間提供者提示。 命名空間提供者可能會忽略此提示。
Windows 7:AI_FILESERVER旗標是在 Windows SDK for Windows 7 和更新版本上定義。 Windows 7 和更新版本支援 AI_FILESERVER 旗標。 |
AI_DISABLE_IDN_ENCODING |
如果 已設定AI_DISABLE_IDN_ENCODING ,這會在 GetAddrInfoW 函式所呼叫的名稱解析函式中使用 Punycode 停用自動國際功能變數名稱編碼。
Windows 8:AI_DISABLE_IDN_ENCODING旗標是在 Windows SDK for Windows 8 和更新版本上定義。 Windows 8 和更新版本支援 AI_DISABLE_IDN_ENCODING 旗標。 |
Windows 8.1和Windows Server 2012 R2:Windows 市集應用程式支援此功能,Windows 8.1、Windows Server 2012 R2 及更新版本。
注意
ws2tcpip.h 標頭會將 GetAddrInfo 定義為別名,根據 UNICODE 預處理器常數的定義,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程式碼,可能會導致編譯或執行時間錯誤不符。 如需詳細資訊,請參閱 函式原型的慣例。
規格需求
最低支援的用戶端 | Windows 8.1、Windows Vista [傳統型應用程式 |UWP 應用程式] |
最低支援的伺服器 | Windows Server 2003 [傳統型應用程式 |UWP 應用程式] |
目標平台 | Windows |
標頭 | ws2tcpip.h |
程式庫 | Ws2_32.lib |
Dll | Ws2_32.dll |
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應