ADDRINFOW 構造体 (ws2def.h)

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

構文

typedef struct addrinfoW {
  int              ai_flags;
  int              ai_family;
  int              ai_socktype;
  int              ai_protocol;
  size_t           ai_addrlen;
  PWSTR            ai_canonname;
  struct sockaddr  *ai_addr;
  struct addrinfoW *ai_next;
} ADDRINFOW, *PADDRINFOW;

メンバー

ai_flags

型: int

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

ai_flags メンバーでサポートされている値は Winsock2.h ヘッダー ファイルで定義されており、次の表に示すオプションの組み合わせにすることができます。

意味
AI_PASSIVE
0x01
ソケット アドレスは、 バインド 関数の呼び出しで使用されます。
AI_CANONNAME
0x02
正規名は、最初の ai_canonname メンバーで返されます。
AI_NUMERICHOST
0x04
GetAddrInfoW 関数に渡される nodename パラメーターは、数値文字列である必要があります。
AI_ALL
0x0100
このビットが設定されている場合、AI_V4MAPPEDを 持つ IPv6 アドレスと IPv4 アドレスに対して要求が行われます。

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

AI_ADDRCONFIG
0x0400
GetAddrInfoW は、グローバル アドレスが構成されている場合にのみ解決されます。 IPv6 および IPv4 ループバック アドレスは、有効なグローバル アドレスとは見なされません。 このオプションは、Windows Vista 以降でのみサポートされています。
AI_V4MAPPED
0x0800
IPv6 アドレスに対 する GetAddrInfoW 要求が失敗した場合、IPv4 アドレスに対してネーム サービス要求が行われ、これらのアドレスは IPv4 マップされた IPv6 アドレス形式に変換されます。

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

AI_NON_AUTHORITATIVE
0x04000
アドレス情報は、権限のない名前空間プロバイダーから取得できます。

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

AI_SECURE
0x08000
アドレス情報は、セキュリティで保護されたチャネルからの情報です。

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

AI_RETURN_PREFERRED_NAMES
0x010000
アドレス情報は、ユーザーの優先名を表します。

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

AI_FQDN
0x00020000
フラット名 (単一ラベル) が指定されている場合、 GetAddrInfoW は名前が最終的に解決された完全修飾ドメイン名を返します。 完全修飾ドメイン名は、 ai_canonname メンバーで返されます。

これは、DNS に登録されている正規名を返す AI_CANONNAME ビット フラグとは異なります。これは、フラット名が解決された完全修飾ドメイン名とは異なる場合があります。

設定できるのは、 AI_FQDN ビットと AI_CANONNAME ビットの 1 つだけです。 両方のフラグがEAI_BADFLAGSと共に存在する場合、GetAddrInfoW 関数は失敗します。

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

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

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

AI_DISABLE_IDN_ENCODING
0x00080000
GetAddrInfoW 関数によって呼び出される名前解決関数で 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

種類: PWSTR

ホストの正規名。

ai_addr

型: 構造体 sockaddr*

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

ai_next

型: 構造体 addrinfoW*

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

注釈

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

addrinfo 構造体は、ANSI getaddrinfo 関数によって使用されるこの構造体の ANSI バージョンです。

Ws2tcpip.h ヘッダー ファイル内のマクロでは、ADDRINFOT 構造体と GetAddrInfo の大文字と小文字が混在する関数名を定義します。 GetAddrInfo 関数は、TCHAR 型のポインターの nodename パラメーターと servname パラメーター、および ADDRINFOT 型のポインターのヒントres パラメーターを使用して呼び出す必要があります。 UNICODE または_UNICODEが定義されている場合、 ADDRINFOTaddrinfoW 構造体に定義され、 GetAddrInfo はこの関数の Unicode バージョンである GetAddrInfoW に定義されます。 UNICODE または_UNICODEが定義されていない場合、 ADDRINFOTaddrinfo 構造体に定義され、 GetAddrInfo は、この関数の ANSI バージョンである getaddrinfo に対して定義されます。

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

次のコード例は、 addrinfoW 構造体の使用方法を示しています。

#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;

    ADDRINFOW *result = NULL;
    ADDRINFOW *ptr = NULL;
    ADDRINFOW hints;

    DWORD dwRetval = 0;
    int i = 1;

    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 GetAddrInfoW with following parameters:\n");
    wprintf(L"\tName = %ws\n", argv[1]);
    wprintf(L"\tServiceName (or port) = %ws\n\n", argv[2]);

//--------------------------------
// Call GetAddrInfoW(). If the call succeeds,
// the aiList variable will hold a linked list
// of addrinfo structures containing response
// information about the host
    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");
            // 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);
    }

    FreeAddrInfo(result);
    WSACleanup();

    return 0;
}

要件

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

こちらもご覧ください

GetAddrInfoEx

GetAddrInfoW

WSAEnumProtocols

addrinfo

addrinfoex

addrinfoex2

getaddrinfo

Sockaddr