ADDRINFOEXW 構造体 (ws2def.h)

addrinfoex 構造体は、ホスト アドレス情報を保持するために GetAddrInfoEx 関数によって使用されます。

構文

typedef struct addrinfoexW {
  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;
  LPGUID             ai_provider;
  struct addrinfoexW *ai_next;
} ADDRINFOEXW, *PADDRINFOEXW, *LPADDRINFOEXW;

メンバー

ai_flags

型: int

GetAddrInfoEx 関数で使用されるオプションを示すフラグ。

ai_flags メンバーでサポートされる値は Winsock2.h インクルード ファイルで定義され、次のオプションの組み合わせにすることができます。

意味
AI_PASSIVE
0x01
ソケット アドレスは、 バインド 関数の呼び出しで使用されます。
AI_CANONNAME
0x02
正規名は、最初の ai_canonname メンバーで返されます。

AI_CANONNAMEビットとAI_FQDNビットの両方が設定されると、addrinfoex 構造体ではなく addrinfoex2 構造体が返されます。

AI_NUMERICHOST
0x04
GetAddrInfoEx 関数に渡される nodename パラメーターは、数値文字列である必要があります。
AI_ALL
0x0100
このビットが設定されている場合、AI_V4MAPPEDを 持つ IPv6 アドレスと IPv4 アドレスに対して要求が行われます。

このオプションは、Windows Vista 以降でサポートされています。

AI_ADDRCONFIG
0x0400
GetAddrInfoEx は、グローバル アドレスが構成されている場合にのみ解決されます。 IPv6 および IPv4 ループバック アドレスは、有効なグローバル アドレスとは見なされません。

このオプションは、Windows Vista 以降でのみサポートされています。

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

このオプションは、Windows Vista 以降でサポートされています。

AI_NON_AUTHORITATIVE
0x04000
アドレス情報は、権限のない結果から取得されます。

GetAddrInfoExpHints パラメーターでこのオプションを設定すると、NS_EMAIL名前空間プロバイダーは権限のある結果と権限のない結果の両方を返します。 このオプションが設定されていない場合は、権限のある結果のみが返されます。

GetAddrInfoEx によって返される ppResults パラメーターでは、このフラグは、権限のない結果の addrinfoex 構造体のai_flags メンバーに設定されます。

このオプションは、Windows Vista 以降の NS_EMAIL 名前空間でのみサポートされます。

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

GetAddrInfoExpHints パラメーターでこのオプションを設定すると、NS_EMAIL名前空間プロバイダーは、スプーフィングの可能性を最小限に抑えるために、強化されたセキュリティで取得された結果のみを返します。

GetAddrInfoEx によって返される ppResults パラメーターでは、このフラグは、なりすましの可能性を最小限に抑えるために、セキュリティが強化された結果として返される addrinfoex 構造体のai_flags メンバーに設定されます。

このオプションは、Windows Vista 以降の NS_EMAIL 名前空間でのみサポートされます。

AI_RETURN_PREFERRED_NAMES
0x010000
アドレス情報は、特定の名前空間を持つパブリケーションに推奨される名前用です。

GetAddrInfoExpHints パラメーターでこのオプションを設定すると、pName パラメーターに名前を指定する必要はなく、NS_EMAIL名前空間プロバイダーはパブリケーションの優先名を返します。

GetAddrInfoEx によって返される ppResults パラメーターでは、このフラグは、パブリケーションの優先名に対して返される結果の addrinfoex 構造体のai_flags メンバーに設定されます。

このオプションは、Windows Vista 以降の NS_EMAIL 名前空間でのみサポートされます。

AI_FQDN
0x00020000
完全修飾ドメイン名は、最初の ai_canonicalname メンバーで返されます。

GetAddrInfoExpHints パラメーターでこのオプションを設定し、pName パラメーターにフラット名 (単一ラベル) を指定すると、最終的に名前が解決された完全修飾ドメイン名が返されます。

AI_CANONNAMEビットとAI_FQDNビットの両方が設定されると、addrinfoex 構造体ではなく addrinfoex2 構造体が返されます。

このオプションは、Windows 7、Windows Server 2008 R2 以降でサポートされています。

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

このオプションは、Windows 7、Windows Server 2008 R2 以降でサポートされています。

AI_DISABLE_IDN_ENCODING
0x00080000
GetAddrInfoEx 関数によって呼び出される名前解決関数で Punycode を使用して、国際ドメイン名の自動エンコードを無効にします。

このオプションは、Windows 8、Windows Server 2012、以降でサポートされています。

ai_family

型: int

アドレス ファミリ。 アドレス ファミリに使用できる値は、 Winsock2.h インクルード ファイルで定義されています。

Windows Vista 以降用にリリースされたWindows SDKでは、ヘッダー ファイルのorganizationが変更され、アドレス ファミリの使用可能な値が Ws2def.h ヘッダー ファイルで定義されます。 Ws2def.h ヘッダー ファイルは Winsock2.h に自動的に含まれるので、直接使用しないでください。

現在サポートされている値は 、IPv4 と IPv6 のインターネット アドレス ファミリ形式である AF_INETまたはAF_INET6です。 アドレス ファミリの Windows ソケット サービス プロバイダーがインストールされている場合、アドレス ファミリのその他のオプション (NetBIOS で使用するためのAF_NETBIOSなど) がサポートされます。 AF_ アドレス ファミリ定数とプロトコル ファミリ定数PF_の値は同一であるため ( たとえば、AF_UNSPECPF_UNSPEC)、どちらの定数も使用できます。

次の表に、アドレス ファミリの一般的な値を示しますが、他の多くの値を使用できます。

意味
AF_UNSPEC
0
アドレス ファミリが指定されていません。
AF_INET
2
インターネット プロトコル バージョン 4 (IPv4) アドレス ファミリ。
AF_NETBIOS
17
NetBIOS アドレス ファミリ。 このアドレス ファミリは、NetBIOS 用 Windows ソケット プロバイダーがインストールされている場合にのみサポートされます。
AF_INET6
23
インターネット プロトコル バージョン 6 (IPv6) アドレス ファミリ。
AF_IRDA
26
赤外線データ関連付け (IrDA) アドレス ファミリ。 このアドレス ファミリは、コンピューターに赤外線ポートとドライバーがインストールされている場合にのみサポートされます。
AF_BTH
32
Bluetooth アドレス ファミリ。 このアドレス ファミリは、Bluetooth アダプターが Windows Server 2003 以降にインストールされている場合にのみサポートされます。

ai_socktype

型: int

ソケットの種類。 ソケットの種類に使用できる値は、 Winsock2.h インクルード ファイルで定義されています。

次の表に、Windows Sockets 2 でサポートされているソケットの種類に使用できる値を示します。

意味
Sock_stream
1
OOB データ転送メカニズムを使用して、シーケンス化された信頼性の高い双方向の接続ベースのバイト ストリームを提供します。 インターネット アドレス ファミリ (AF_INET または AF_INET6) に伝送制御プロトコル (TCP) を使用します。 ai_family メンバーがAF_IRDA場合、SOCK_STREAMのみがサポートされているソケットの種類です。
SOCK_DGRAM
2
固定 (通常は小さい) 最大長のコネクションレスで信頼性の低いバッファーであるデータグラムをサポートします。 インターネット アドレス ファミリ (AF_INET または AF_INET6) にユーザー データグラム プロトコル (UDP) を使用します。
SOCK_RAW
3
アプリケーションが次の上位層プロトコル ヘッダーを操作できるようにする生ソケットを提供します。 IPv4 ヘッダーを操作するには、 ソケットで IP_HDRINCL ソケット オプションを設定する必要があります。 IPv6 ヘッダーを操作するには、 ソケットで IPV6_HDRINCL ソケット オプションを設定する必要があります。
SOCK_RDM
4
信頼性の高いメッセージ データグラムを提供します。 この種類の例として、Windows でのプラグマティック一般マルチキャスト (PGM) マルチキャスト プロトコルの実装があります。これは、多くの場合、 信頼性の高いマルチキャスト プログラミングと呼ばれます。
SOCK_SEQPACKET
5
データグラムに基づく擬似ストリーム パケットを提供します。
 

Windows ソケット 2 では、新しいソケットの種類が導入されました。 アプリケーションは、 WSAEnumProtocols 関数を使用して、使用可能な各トランスポート プロトコルの属性を動的に検出できます。 そのため、アプリケーションはアドレス ファミリに使用可能なソケットの種類とプロトコル オプションを決定し、このパラメーターを指定するときにこの情報を使用できます。 Winsock2.h および Ws2def.h ヘッダー ファイルのソケットの種類の定義は、新しいソケットの種類、アドレス ファミリ、およびプロトコルが定義されると、定期的に更新されます。

Windows ソケット 1.1 では、使用可能なソケットの種類は SOCK_DATAGRAMSOCK_STREAMのみです。

ai_protocol

型: int

プロトコルの種類。 使用可能なオプションは、指定されたアドレス ファミリとソケットの種類に固有です。 ai_protocolに使用できる値は、Winsock2.h および Wsrm.h ヘッダー ファイルで定義されています。

Windows Vista 以降でリリースされたWindows SDKでは、ヘッダー ファイルのorganizationが変更され、このメンバーは Ws2def.h ヘッダー ファイルで定義されている IPPROTO 列挙型の値のいずれかになります。 Ws2def.h ヘッダー ファイルは Winsock2.h に自動的に含まれるので、直接使用しないでください。

ai_protocolに値 0 を指定した場合、呼び出し元はプロトコルを指定せず、サービス プロバイダーは使用するai_protocolを選択します。 IPv4 および IPv6 以外のプロトコルの場合は、 ai_protocol を 0 に設定します。

次の表は、他の多くの値が可能ですが、 ai_protocol メンバーの一般的な値を示しています。

意味
IPPROTO_TCP
6
伝送制御プロトコル (TCP)。 これは、ai_family メンバーがAF_INETまたはAF_INET6、ai_socktype メンバーがSOCK_STREAMされている場合使用できる値です。
IPPROTO_UDP
17
ユーザー データグラム プロトコル (UDP)。 これは、ai_family メンバーがAF_INETまたはAF_INET6、型パラメーターがSOCK_DGRAMされている場合に使用できる値です。
IPPROTO_RM
113
信頼性の高いマルチキャスト用の PGM プロトコル。 これは、ai_family メンバーがAF_INETされ、ai_socktype メンバーがSOCK_RDMされている場合に使用できる値です。 Windows Vista 以降用にリリースされたWindows SDKでは、この値は IPPROTO_PGM とも呼ばれます。
 

ai_family メンバーがAF_IRDA場合、ai_protocolは 0 である必要があります。

ai_addrlen

種類: size_t

ai_addr メンバーが指すバッファーの長さ (バイト単位)。

ai_canonname

種類: PCTSTR

ホストの正規名。

ai_addr

型: 構造体 sockaddr*

sockaddr 構造体へのポインター。 返される各 addrinfoex 構造体のai_addr メンバーは、入力されたソケット アドレス構造を指します。 返される各 addrinfoex 構造体の長さ (バイト単位) は 、ai_addrlen メンバーで指定されます。

ai_blob

型: void*

アドレスの一覧を超えて名前に関連付けられているプロバイダー固有の名前空間情報を返すために使用されるデータへのポインター。 ai_blobが指すバッファーの長さ (バイト単位) は、ai_bloblen メンバーで指定する必要があります。

ai_bloblen

種類: size_t

ai_blob メンバーの長さ (バイト単位)。

ai_provider

種類: LPGUID

特定の名前空間プロバイダーの GUID へのポインター。

ai_next

型: 構造体 addrinfoex*

リンク リスト内の次の構造体へのポインター。 このパラメーターは、リンクリストの最後の addrinfoex 構造体で NULL に設定されます。

注釈

addrinfoex 構造体は、ホスト アドレス情報を保持するために GetAddrInfoEx 関数によって使用されます。 addrinfoex 構造体は、addrinfo および addrinfoW 構造体の拡張バージョンです。 追加の構造体メンバーは、BLOB データと名前空間プロバイダーの GUID 用です。 BLOB データは、名前に関連付けられている追加のプロバイダー固有の名前空間情報を返すために使用されます。 ai_blob メンバー内のデータの形式は、特定の名前空間プロバイダーに固有です。 現在、BLOB データは 、NS_EMAIL 名前空間プロバイダーによって追加情報を提供するために使用されます。

addrinfoex 構造体は、GetAddrInfoEx 関数で使用される addrinfo および addrinfoW 構造体の拡張バージョンです。 GetAddrInfoEx 関数を使用すると、名前空間プロバイダーを指定してクエリを解決できます。 IPv6 および IPv4 プロトコルで使用する場合、名前解決には、ドメイン ネーム システム (DNS)、ローカル ホスト ファイル、電子メール プロバイダー ( NS_EMAIL 名前空間)、またはその他の名前付けメカニズムを使用できます。

UNICODE または_UNICODEが定義されている場合、 addrinfoex は、この構造体の Unicode バージョンである addrinfoexW に定義されます。 文字列パラメーターは PWSTR データ型に定義され、 addrinfoexW 構造体が使用されます。

UNICODE または_UNICODEが定義されていない場合、 addrinfoex は 、この構造体の ANSI バージョンである addrinfoexA に定義されます。 文字列パラメーターは PCSTR データ型であり、 addrinfoexA 構造体が使用されます。

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

次の例では、 addrinfoex 構造体の使用方法を示します。


#ifndef UNICODE
#define UNICODE
#endif

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

#pragma comment(lib, "Ws2_32.lib")

int __cdecl wmain(int argc, wchar_t ** argv)
{
//--------------------------------
// Declare and initialize variables.
    WSADATA wsaData;
    int iResult;

    ADDRINFOEX *result = NULL;
    ADDRINFOEX *ptr = NULL;
    ADDRINFOEX hints;

    DWORD dwRetval = 0;
    int i = 1;

    DWORD dwNamespace = NS_DNS;
    LPGUID lpNspid = NULL;

    struct sockaddr_in *sockaddr_ipv4;
    struct sockaddr_in6 *sockaddr_ipv6;
//    LPSOCKADDR sockaddr_ip;

    wchar_t ipstringbuffer[46];

    // Validate the parameters
    if (argc != 3) {
        wprintf(L"usage: %ws <hostname> <servicename>\n", argv[0]);
        wprintf(L"       provides protocol-independent translation\n");
        wprintf(L"       from a 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 GetAddrInfoW() function
    memset(&hints, 0, sizeof (hints));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    wprintf(L"Calling GetAddrInfoEx with following parameters:\n");
    wprintf(L"\tName = %ws\n", argv[1]);
    wprintf(L"\tServiceName (or port) = %ws\n\n", argv[2]);

//--------------------------------
// Call GetAddrInfoEx(). If the call succeeds,
// the aiList variable will hold a linked list
// of ADDRINFOEX structures containing response
// information about the host
    dwRetval = GetAddrInfoEx(argv[1], argv[2],
                             dwNamespace, lpNspid, &hints, &result,
                             NULL, NULL, NULL, NULL);

    if (dwRetval != 0) {
        wprintf(L"GetAddrInfoEx failed with error: %d\n", dwRetval);
        WSACleanup();
        return 1;
    }
    wprintf(L"GetAddrInfoEx returned success\n");

    // Retrieve each address and print out the hex bytes
    for (ptr = result; ptr != NULL; ptr = ptr->ai_next) {

        wprintf(L"GetAddrInfoEx 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");
            // the InetNtop function is available on Windows Vista and later
            sockaddr_ipv4 = (struct sockaddr_in *) ptr->ai_addr;
            wprintf(L"\tIPv4 address %ws\n",
                    InetNtop(AF_INET, &sockaddr_ipv4->sin_addr, ipstringbuffer,
                             46));

            // We could also use the WSAAddressToString function
            // 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;
            wprintf(L"\tIPv6 address %ws\n",
                    InetNtop(AF_INET6, &sockaddr_ipv6->sin6_addr,
                             ipstringbuffer, 46));

            // We could also use WSAAddressToString which also returns the scope ID
            // 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);
    }

    FreeAddrInfoEx(result);
    WSACleanup();

    return 0;
}


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

要件

要件
サポートされている最小のクライアント Windows Vista [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2008 [デスクトップ アプリのみ]
Header ws2def.h (Windows Server 2012、Windows 7 Windows Server 2008 R2 を含む)

こちらもご覧ください

GetAddrInfoEx

addrinfo

addrinfoW