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 文字列へのポインター。 インターネット プロトコルの場合、数値ホスト アドレス文字列はドット 10 進数の IPv4 アドレスまたは IPv6 16 進アドレスです。

[in, optional] pServiceName

文字列として表されるサービス名またはポート番号を含む NULL で終わる Unicode 文字列へのポインター。

サービス名は、ポート番号の文字列エイリアスです。 たとえば、"http" は、インターネット エンジニアリング タスク フォース (IETF) によって HTTP プロトコルの Web サーバーで使用される既定のポートとして定義されているポート 80 のエイリアスです。 ポート番号が指定されていない場合の pServiceName パラメーターに指定できる値を次のファイルに示します。

%WINDIR%\system32\drivers\etc\services

[in, optional] pHints

呼び出し元がサポートするソケットの種類に関するヒントを提供する addrinfoW 構造体へのポインター。

pHints パラメーターが指addrinfoW 構造体のai_addrlen、ai_canonnameai_addr、およびai_nextメンバーは、0 または NULL である必要があります。 それ以外の場合、 GetAddrInfoEx 関数は WSANO_RECOVERYで失敗します。

詳細については、「解説」を参照してください。

[out] ppResult

ホストに関する応答情報を含む 1 つ以上の addrinfoW 構造体のリンクされたリストへのポインター。

戻り値

成功すると 0 が返されます。 Failure は、Windows ソケット エラー コードに示されているように、0 以外の Windows ソケット エラー コードを返します

GetAddrInfoW 関数によって返される 0 以外のエラー コードのほとんどは、インターネット エンジニアリング タスク フォース (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 メンバーはサポートされていません。
 

getAddrInfoW 関数によって返されるEAI_* コードに基づいてエラー メッセージを出力するには、gai_strerror関数を使用します。 gai_strerror関数は IETF の推奨事項に準拠するために提供されますが、スレッド セーフではありません。 そのため、 WSAGetLastError などの従来の Windows ソケット関数を使用することをお勧めします。

エラー コード 意味
WSA_NOT_ENOUGH_MEMORY
操作を実行するためのメモリが不足していました。
WSAEAFNOSUPPORT
要求されたプロトコルと互換性のないアドレスが使用されました。 hints パラメーターが指す addrinfoW 構造体のai_family メンバーがサポートされていない場合、このエラーが返されます。
WSAEINVAL
無効な引数が指定されました。 このエラーは、hints パラメーターが指す addrinfoW 構造体のai_flags メンバーに無効な値が指定された場合に返されます。
WSAESOCKTNOSUPPORT
このアドレス ファミリでは、指定したソケット タイプはサポートされていません。 このエラーは、hints パラメーターが指す addrinfoW 構造体のai_socktype メンバーがサポートされていない場合に返されます。
WSAHOST_NOT_FOUND
そのようなホストは不明です。 このエラーは、指定されたパラメーターの名前が解決されない場合、または pNodename パラメーターと pServicename パラメーターが指定されていない場合に返されます。
WSANO_DATA
要求された名前は有効ですが、要求された種類のデータが見つかりませんでした。
WSANO_RECOVERY
データベースの参照中に、修復できないエラーが発生しました。 このエラーは、名前解決で回復不可能なエラーが発生した場合に返されます。
WSANOTINITIALIZED
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。
WSATRY_AGAIN
これは、通常、ホスト名の解決中に発生する一時エラーであり、ローカル サーバーが、権限のあるサーバーから応答を受信しなかったことを示します。 このエラーは、名前解決で一時的なエラーが発生したときに返されます。
WSATYPE_NOT_FOUND
指定したクラスが見つかりませんでした。 pServiceName パラメーターは、hints パラメーターが指す addrinfoW 構造体の指定されたai_socktype メンバーではサポートされていません。

解説

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が定義されている場合、 GetAddrInfoGetAddrInfoW、関数の Unicode バージョン、 ADDRINFOTaddrinfoW 構造体に定義されます。 UNICODE または_UNICODEが定義されていない場合、 GetAddrInfogetaddrinfo に定義され、関数の ANSI バージョン、 ADDRINFOTaddrinfo 構造体に定義されます。

pNodeName パラメーターまたは pServiceName パラメーターの一方または両方が NULL で終わる Unicode 文字列を指している必要があります。一般に、両方が提供されます。

成功すると、 addrinfoW 構造体のリンクされたリストが ppResult パラメーターで返されます。 リストは、NULL ポインターが検出されるまで、返された各 addrinfoW 構造体のai_next メンバーに指定されたポインターに従って処理できます。 返される各 addrinfoW 構造体では、 ai_familyai_socktypeおよび ai_protocol メンバーはソケット または WSASocket 関数呼び出しのそれぞれの引数に対応します。 また、返される各 addrinfoW 構造体のai_addr メンバーは、入力されたソケット アドレス構造体を指し、その長さは ai_addrlen メンバーで指定されます。

pNodeName パラメーターがコンピューター名を指している場合は、ソース アドレスとして使用できるコンピューターのすべての永続的なアドレスが返されます。 Windows Vista 以降では、これらのアドレスには、MIB_UNICASTIPADDRESS_ROW構造体でSkipAsSource メンバーが false に設定されている GetUnicastIpAddressTable 関数または GetUnicastIpAddressEntry 関数によって返されるすべてのユニキャスト IP アドレスが含まれます。

pNodeName パラメーターが "localhost" と等しい文字列を指している場合は、ローカル コンピューター上のすべてのループバック アドレスが返されます。

pNodeName パラメーターに空の文字列が含まれている場合は、ローカル コンピューター上のすべての登録済みアドレスが返されます。

Windows Server 2003 以降では、 pNodeName パラメーターが に等しい文字列を指している場合。localmachine", ローカル コンピューター上のすべての登録済みアドレスが返されます。

pNodeName パラメーターがクラスター仮想サーバー名を参照している場合は、仮想サーバー アドレスのみが返されます。 Windows Vista 以降では、これらのアドレスには、MIB_UNICASTIPADDRESS_ROW構造体でSkipAsSource メンバーが true に設定されている GetUnicastIpAddressTable 関数または GetUnicastIpAddressEntry 関数によって返されるすべてのユニキャスト IP アドレスが含まれます。 クラスタリングの詳細については、「 Windows クラスタリング 」を参照してください。

Windows 7 Service Pack 1 (SP1) と Windows Server 2008 R2 service Pack 1 (SP1) は、IP アドレスに SkipAsSource 属性を設定するためのサポートを Netsh.exe に追加します。 これにより、MIB_UNICASTIPADDRESS_ROW構造体の SkipAsSource メンバーが false に設定されている場合、IP アドレスが DNS に登録されるように動作も変更されます。 SkipAsSource メンバーが true に設定されている場合、IP アドレスは DNS に登録されません。

Windows 7 および Windows Server 2008 R2 では、IP アドレスに SkipAsSource 属性を設定するためのサポートを Netsh.exe に追加する修正プログラムを使用できます。 また、この修正プログラムは、MIB_UNICASTIPADDRESS_ROW構造体の SkipAsSource メンバーが false に設定されている場合、IP アドレスが DNS に登録されるように動作も変更します。 SkipAsSource メンバーが true に設定されている場合、IP アドレスは DNS に登録されません。 詳細については、「 ナレッジ ベース (KB) 2386184」を参照してください。

同様の修正プログラムは、Service Pack 2 (SP2) と Windows Server 2008 Service Pack 2 (SP2) を使用して、IP アドレスに SkipAsSource 属性を設定するための Netsh.exe のサポートを追加する Windows Vista でも使用できます。 また、この修正プログラムは、MIB_UNICASTIPADDRESS_ROW構造体の SkipAsSource メンバーが false に設定されている場合、IP アドレスが DNS に登録されるように動作も変更します。 SkipAsSource メンバーが true に設定されている場合、IP アドレスは DNS に登録されません。

GetAddrInfoW 関数の呼び出し元は、pHints パラメーターによって指される addrinfoW 構造体によってサポートされるソケットの種類に関するヒントを提供できます。 pHints パラメーターを使用すると、関連付けられている addrinfoW 構造体に次の規則が適用されます。

  • ai_family の値AF_UNSPECは、呼び出し元がAF_INETとAF_INET6アドレス ファミリのみを受け入れることを示しますAF_UNSPECPF_UNSPECは同じであることに注意してください。
  • ai_socktype の値 0 は、呼び出し元が任意のソケット型を受け入れることを示します。
  • ai_protocol の値 0 は、呼び出し元が任意のプロトコルを受け入れることを示します。
  • ai_addrlen メンバーは 0 に設定する必要があります。
  • 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 構造体が AF_UNSPEC に設定されたai_family メンバーで初期化され、他のすべてのメンバーがゼロに設定されたかのように処理します。

Windows Vista 以降では、 GetAddrInfoW がサービスから呼び出されると、操作がサービスを呼び出すユーザー プロセスの結果である場合、サービスはユーザーを偽装する必要があります。 これは、セキュリティを適切に適用できるようにするためです。

GetAddrInfoW 関数を使用すると、IP アドレスのテキスト文字列表現を、IP アドレスとその他の情報の sockaddr 構造体を含む addrinfoW 構造体に変換できます。 この方法で使用するには、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;
}

メモ開発環境が、addrinfoWGetAddrInfoW の構造体と関数の定義を含む Ws2tcpip.h の最新バージョンをターゲットにしていることを確認します。
 

国際化されたドメイン名

インターネット ホスト名は、通常、非常に制限された文字セットで構成されます。
  • 英文字の大文字と小文字の ASCII 文字。
  • 0 から 9 の数字。
  • ASCII ハイフン文字。

インターネットの増加に伴い、ASCII 文字セットで表されない他の言語のインターネット ホスト名を識別する必要性が高まっています。 このニーズを容易にし、ASCII 以外の文字 (Unicode) を特殊な ASCII 文字列として表現できるようにする識別子は、国際化ドメイン名 (IDN) と呼ばれます。 アプリケーションのドメイン名の国際化 (IDNA) と呼ばれるメカニズムは、IDN を標準的な方法で処理するために使用されます。 IDN と IDNA の仕様については、インターネット エンジニアリング タスク フォース (IETF) によって公開されている RFC 3490RTF 5890RFC 6365 に記載されています。

Windows 8 および Windows Server 2012 では、 GetAddrInfoW 関数は、 pNodeName パラメーターで渡された名前に適用される国際化ドメイン名 (IDN) 解析のサポートを提供します。 Winsock は、Punycode/IDN エンコードと変換を実行します。 この動作は、以下で説明する AI_DISABLE_IDN_ENCODING フラグを使用して無効にすることができます。

Windows 7 および Windows Server 2008 R2 以前では、 GetAddrInfoW 関数は現在、 pNodeName パラメーターで渡された名前に適用される IDN 解析のサポートを提供していません。 Winsock では、Punycode/IDN 変換は実行されません。 GetAddrInfoW 関数は、RFC 3490 に従って IDN を変換するために Punycode を使用しません。 DNS に対してクエリを実行する場合の GetAddrInfoW 関数は、エンタープライズ環境で Microsoft DNS サーバーによって使用される形式である UTF-8 形式で Unicode 名をエンコードします。

Windows Vista 以降のいくつかの関数では、IDN 内の Unicode ラベルから ASCII に相当するラベルへの変換がサポートされています。 結果として得られる各 Unicode ラベルの表現には ASCII 文字のみが含まれ、Unicode ラベルに ASCII 以外の文字が含まれている場合は xn-- プレフィックスで始まります。 これは、一部の DNS ツールとサーバーで ASCII 文字のみがサポートされるため、インターネット上の既存の DNS サーバーをサポートするためです ( RFC 3490 を参照)。

IdnToAscii 関数は、RFC 3490 で定義されている標準アルゴリズムを使用して、Punycode を使用して 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 Server 2008 および Windows Vista 用 Windows SDK の Ws2tcpip.h ヘッダー ファイルで定義されています。 これらのフラグ ビットは、Windows Server 2003 および Windows XP 用プラットフォーム ソフトウェア開発キット (SDK) の Ws2tcpip.h ヘッダー ファイルで定義されています。

フラグ ビットには、次の組み合わせを指定できます。

フラグ ビット 説明
AI_PASSIVE AI_PASSIVE フラグを設定すると、呼び出し元は、バインド関数の呼び出しで返されたソケット アドレス構造を使用することを示します。 AI_PASSIVE フラグが設定され、pNodeNameNULL ポインターである場合、ソケット・アドレス構造の IP アドレス部分は、IPv4 アドレスの場合はINADDR_ANY、IPv6 アドレスの場合はIN6ADDR_ANY_INITに設定されます。

AI_PASSIVE フラグが設定されていない場合、返されるソケット アドレス構造体は、接続指向プロトコルの接続関数を呼び出す準備が整っているか、コネクションレス プロトコルの接続sendto、または send 関数を呼び出す準備ができています。 この場合、 pNodeName パラメーターが NULL ポインターの場合、ソケット・アドレス構造の IP アドレス部分はループバック・アドレスに設定されます。

AI_CANONNAME AI_CANONNAMEAI_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 Vista 以降の Windows SDK で定義されています。 AI_NUMERICSERV フラグは、Microsoft プロバイダーではサポートされていません。

AI_ALL AI_ALL ビットが設定されている場合は、AI_V4MAPPEDを持つ IPv6 アドレスと IPv4 アドレスに対して要求が行われます。

AI_ALL フラグは、Windows Vista 用 Windows SDK 以降で定義されています。 AI_ALL フラグは、Windows Vista 以降でサポートされています。

AI_ADDRCONFIG AI_ADDRCONFIG ビットが設定されている場合、グローバル アドレスが構成されている場合にのみ GetAddrInfoW が解決されます。 AI_ADDRCONFIG フラグが指定されている場合、IPv4 アドレスは、ローカル システムで IPv4 アドレスが構成されている場合にのみ返され、IPv6 アドレスはローカル システムで IPv6 アドレスが構成されている場合にのみ返されます。 IPv4 または IPv6 ループバック アドレスは、有効なグローバル アドレスとは見なされません。

AI_ADDRCONFIG フラグは、Windows Vista 用 Windows SDK 以降で定義されています。 AI_ADDRCONFIG フラグは、Windows Vista 以降でサポートされています。

AI_V4MAPPED AI_V4MAPPED ビットが設定され、IPv6 アドレスの要求が失敗した場合、IPv4 アドレスに対してネーム サービス要求が行われ、これらのアドレスは IPv4 マップ IPv6 アドレス形式に変換されます。

AI_V4MAPPED フラグは、Windows Vista 用 Windows SDK 以降で定義されています。 AI_V4MAPPED フラグは、Windows Vista 以降でサポートされています。

AI_NON_AUTHORITATIVE AI_NON_AUTHORITATIVE ビットが設定されている場合、NS_EMAIL名前空間プロバイダーは、権限のある結果と権限のない結果の両方を返します。 AI_NON_AUTHORITATIVE ビットが設定されていない場合、NS_EMAIL名前空間プロバイダーは権限のある結果のみを返します。

AI_NON_AUTHORITATIVE フラグは、Windows Vista 用 Windows SDK 以降で定義されています。 AI_NON_AUTHORITATIVE フラグは Windows Vista 以降でサポートされており、NS_EMAIL名前空間にのみ適用されます。

AI_SECURE AI_SECURE ビットが設定されている場合、NS_EMAIL名前空間プロバイダーは、スプーフィングの可能性を最小限に抑えるために、強化されたセキュリティで取得された結果を返します。

AI_SECURE フラグは、Windows Vista 用 Windows SDK 以降で定義されています。 AI_SECURE フラグは Windows Vista 以降でサポートされており、NS_EMAIL名前空間にのみ適用されます。

AI_RETURN_PREFERRED_NAMES AI_RETURN_PREFERRED_NAMESが設定されている場合は、pNodeName パラメーターに名前を指定しないでください。 NS_EMAIL名前空間プロバイダーは、パブリケーションの優先名を返します。

AI_RETURN_PREFERRED_NAMES フラグは、Windows Vista 用 Windows SDK 以降で定義されています。 AI_RETURN_PREFERRED_NAMES フラグは Windows Vista 以降でサポートされており、NS_EMAIL名前空間にのみ適用されます。

AI_FQDN AI_FQDNが設定され、フラット名 (単一ラベル) が指定されている場合、GetAddrInfoW は名前が最終的に解決された完全修飾ドメイン名を返します。 完全修飾ドメイン名は、関連付けられた addrinfoW 構造体の ai_canonname メンバーで返されます。 これは、DNS に登録されている正規名を返す AI_CANONNAME ビット フラグとは異なります。これは、フラット名が解決された完全修飾ドメイン名とは異なる場合があります。 設定できるのは、 AI_FQDN ビットと AI_CANONNAME ビットの 1 つだけです。 両方のフラグがEAI_BADFLAGSと共に存在する場合、GetAddrInfoW 関数は失敗します。

AI_FQDN ビットが設定されている場合、pNodeName パラメーターを NULL にすることはできません。 それ以外の場合、 GetAddrInfoEx 関数は WSANO_RECOVERYで失敗します。

Windows 7: AI_FQDN フラグは、Windows 7 以降の Windows SDK で定義されています。 AI_FQDN フラグは、Windows 7 以降でサポートされています。

AI_FILESERVER AI_FILESERVERが設定されている場合、これは、クエリ対象のホスト名がファイル共有シナリオで使用されていることを名前空間プロバイダーに示すヒントです。 名前空間プロバイダーは、このヒントを無視できます。

Windows 7: AI_FILESERVER フラグは、Windows 7 以降の Windows SDK で定義されています。 AI_FILESERVER フラグは、Windows 7 以降でサポートされています。

AI_DISABLE_IDN_ENCODING AI_DISABLE_IDN_ENCODINGが設定されている場合、GetAddrInfoW 関数によって呼び出される名前解決関数で Punycode を使用した国際ドメイン名の自動エンコードが無効になります。

Windows 8: AI_DISABLE_IDN_ENCODING フラグは、Windows 8 以降の Windows SDK で定義されています。 AI_DISABLE_IDN_ENCODING フラグは、Windows 8 以降でサポートされています。

 

Windows 8.1Windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。

注意

ws2tcpip.h ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして GetAddrInfo を定義します。 encoding-neutral エイリアスの使用を encoding-neutral ではないコードと混在すると、コンパイル エラーまたはランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「 関数プロトタイプの規則」を参照してください。

要件

   
サポートされている最小のクライアント Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ]
対象プラットフォーム Windows
ヘッダー ws2tcpip.h
Library 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

送信

Sendto

socket