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_addrlenai_canonnameai_addrai_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 未針對提供的參數解析名稱,或未提供 pNodeNamepServiceName 參數。
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

錯誤碼 意義
WSA_NOT_ENOUGH_MEMORY
記憶體不足,無法執行作業。
WSAEAFNOSUPPORT
已使用與要求通訊協定不相容的位址。 如果不支援hints參數所指向的 addrinfoW結構ai_family成員,就會傳回此錯誤。
WSAEINVAL
提供的引數無效。 如果為hints參數所指向之addrinfoW結構ai_flags成員提供不正確值,就會傳回此錯誤。
WSAESOCKTNOSUPPORT
這個地址家族中不存在對指定通訊端類型的支援。 如果不支援 hints參數所指向的addrinfoW結構ai_socktype成員,就會傳回此錯誤。
WSAHOST_NOT_FOUND
沒有已知的此類主機。 如果未針對提供的參數解析名稱,或未提供 pNodenamepServicename 參數,則會傳回此錯誤。
WSANO_DATA
要求的名稱有效,但找不到所要求類型的資料。
WSANO_RECOVERY
資料庫尋查期間發生無法復原的錯誤。 如果發生名稱解析中無法復原的錯誤,就會傳回此錯誤。
WSANOTINITIALISED
使用此函式之前,必須先進行成功的 WSAStartup 呼叫。
WSATRY_AGAIN
這通常為主機名稱解析期間的暫時錯誤,表示本機伺服器未收到授權伺服器的回應。 發生名稱解析暫時失敗時,就會傳回此錯誤。
WSATYPE_NOT_FOUND
找不到指定的類別。 hints參數所指向之 addrinfoW結構的指定ai_socktype成員不支援pServiceName參數。

備註

GetAddrInfoW函式是一個函式的 Unicode 版本,可提供從主機名稱到位址的通訊協定獨立轉譯。 此函式的 ANSI 版本是 getaddrinfo

GetAddrInfoW函式會傳回NS_DNS命名空間的結果。 如果有多個命名空間提供者傳回信息, GetAddrInfoW 函式會匯總所有回應。 若要搭配 IPv6 和 IPv4 通訊協定使用,名稱解析可以透過網域名稱系統 (DNS) 、本機 主機 檔案,或 NS_DNS 命名空間的其他命名機制使用。

Winsock 標頭檔中的宏會定義 GetAddrInfoADDRINFOT 結構的混合大小寫函式名稱。 這個GetAddrInfo函式應該使用TCHAR型別指標的pNodeNamepServiceName參數呼叫,以及ADDRINFOT型別指標的pHintsppResult參數。 定義 UNICODE 或_UNICODE時, GetAddrInfo 會定義為 GetAddrInfoW、函式的 Unicode 版本,而 ADDRINFOT 會定義至 addrinfoW 結構。 未定義 UNICODE 或_UNICODE時, GetAddrInfo 會定義為 getaddrinfo、函式的 ANSI 版本,而 ADDRINFOT 會定義至 addrinfo 結構。

pNodeNamepServiceName參數的一或兩者都必須指向Null終止的 Unicode 字串;通常會提供這兩者。

成功時,ppResult參數會傳回addrinfoW結構的連結清單。 您可以依照每個傳回addrinfoW結構之ai_next成員中提供的指標來處理清單,直到遇到Null指標為止。 在每個傳回 的 addrinfoW 結構中, ai_familyai_socktypeai_protocol 成員會對應到 通訊端WSASocket 函式呼叫中的個別引數。 此外,每個傳回addrinfoW結構中的ai_addr成員會指向填入的通訊端位址結構,其ai_addrlen成員中指定的長度。

如果 pNodeName 參數指向電腦名稱稱,則會傳回可用來做為來源位址的電腦的所有永久位址。 在 Windows Vista 和更新版本上,這些位址會包含 GetUnicastIpAddressTableGetUnicastIpAddressEntry 函式傳回的所有單播 IP 位址, 其中 SkipAsSource 成員在 MIB_UNICASTIPADDRESS_ROW 結構中設定為 false。

如果 pNodeName 參數指向等於 「localhost」 的字串,則會傳回本機電腦上的所有回送位址。

如果 pNodeName 參數包含空字串,則會傳回本機電腦上所有已註冊的位址。

如果 pNodeName 參數指向等於 「. 的字串,則為 Windows Server 2003 和更新版本。localmachine「,會傳回本機電腦上所有已註冊的位址。

如果 pNodeName 參數參考叢集虛擬伺服器名稱,則只會傳回虛擬伺服器位址。 在 Windows Vista 和更新版本上,這些位址會包含 GetUnicastIpAddressTableGetUnicastIpAddressEntry 函式傳回的所有單播 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_familyAF_UNSPEC值表示呼叫端只會接受AF_INETAF_INET6位址系列。 請注意, AF_UNSPECPF_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;
}

注意 請確定開發環境分別以最新版的 Ws2tcpip.h 為目標,其中包含 addrinfoWGetAddrInfoW的結構和函式定義。
 

國際化功能變數名稱

網際網路主機名稱通常包含一組非常受限的字元:
  • 大寫和小寫的英文 ASCII 字母。
  • 0 到 9 位數。
  • ASCII 連字號字元。

隨著網際網路的成長,需要識別非 ASCII 字元集所代表之其他語言的網際網路主機名稱。 有助於此需求的識別碼,並允許非 ASCII 字元 (Unicode) 表示為特殊 ASCII 字元字串,稱為國際功能變數名稱 (IDN) 。 在應用程式 (IDNA) 中稱為國際化功能變數名稱的機制,可用來以標準方式處理 IDN。 IDN 和 IDNA 的規格記載于 INTERNET Engineering Task Force (IETF) 所發佈的 RFC 3490RTF 5890RFC 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 旗標且 pNodeNameNull 指標時,通訊端位址結構的 IP 位址部分會設定為 IPv4 位址 INADDR_ANY, 而 IPv6 位址IN6ADDR_ANY_INIT。

未設定AI_PASSIVE旗標時,傳回的通訊端位址結構已準備好呼叫連線導向通訊協定的connect函式,或準備好呼叫連線傳送或傳送無連線通訊協定的函式。 在此情況下,如果 pNodeName 參數是 Null 指標,通訊端位址結構的 IP 位址部分會設定為回送位址。

AI_CANONNAME 如果未使用 AI_CANONNAMEAI_NUMERICHOSTGetAddrInfoW 函式會嘗試解析。 如果傳遞常值字串 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_FQDNAI_CANONNAME 位。 如果兩個旗標都出現EAI_BADFLAGSGetAddrInfoW函式將會失敗。

設定 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.1Windows 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

另請參閱

FreeAddrInfoW

GetAddrInfoEx

GetHostNameW

IdnToAscii

IdnToUnicode

WSAGetLastError

WSASocket

Winsock 函式

Winsock 參考

addrinfo

addrinfoW

addrinfoex

addrinfoex2

bind

connect

gai_strerror

getaddrinfo

send

sendto

socket