ADDRINFOA 構造体 (ws2def.h)

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

構文

typedef struct addrinfo {
  int             ai_flags;
  int             ai_family;
  int             ai_socktype;
  int             ai_protocol;
  size_t          ai_addrlen;
  char            *ai_canonname;
  struct sockaddr *ai_addr;
  struct addrinfo *ai_next;
} ADDRINFOA, *PADDRINFOA;

メンバー

ai_flags

型: int

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

ai_flags メンバーでサポートされている値は、Windows 7 以降のWindows SDKの Ws2def.h ヘッダー ファイルで定義されています。 これらの値は、Windows Server 2008 および Windows Vista のWindows SDKの Ws2tcpip.h ヘッダー ファイルで定義されています。 これらの値は、Windows Server 2003 および Windows XP 用プラットフォーム SDK の Ws2tcpip.h ヘッダー ファイルで定義されています。 ai_flags メンバーでサポートされる値は、次のオプションの組み合わせになります。

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

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

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

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

AI_V4MAPPED
0x0800
IPv6 アドレスの getaddrinfo 要求が失敗した場合、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
フラット名 (単一ラベル) が指定されている場合、 getaddrinfo は、その名前が最終的に解決された完全修飾ドメイン名を返します。 完全修飾ドメイン名は、 ai_canonname メンバーで返されます。

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

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

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

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

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

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 ソケット 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

型: char*

ホストの正規名。

ai_addr

型: 構造体 sockaddr*

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

ai_next

型: 構造体 addrinfo*

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

注釈

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

addrinfoW 構造体は、Unicode GetAddrInfoW 関数で使用されるこの構造体のバージョンです。

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

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

古いバージョンの Windows での getaddrinfo および addrinfo 構造体のサポート

addrinfo 構造体を使用する getaddrinfo 関数が、Windows XP 以降の Ws2_32.dll に追加されました。 addrinfo 構造体は、Windows XP 以降でリリースされたプラットフォーム SDK と、Windows Vista 以降でリリースされたWindows SDKに含まれる Ws2tcpip.h ヘッダー ファイルで定義されています。

以前のバージョンの Windows (Windows 2000) で getaddrinfo 関数と addrinfo 構造体を使用するアプリケーションを実行するには、 Ws2tcpip.h ファイルと Wspiapi.h ファイルを含める必要があります。 Wspiapi.h インクルード ファイルを追加すると、getaddrinfo 関数は Wspiapi.h ファイルの WspiapiGetAddrInfo インライン関数に定義されます。 実行時に、WspiapiGetAddrInfo 関数は、 Ws2_32.dll または Wship6.dll (Windows 2000 の IPv6 テクノロジ プレビューの getaddrinfo を含むファイル) に getaddrinfo が含まれていない場合に、 getaddrinfo のバージョンが Wspiapi.h ヘッダー ファイル内のコードに基づいてインラインで実装されるように実装されます。 このインライン コードは、 getaddrinfo 関数をネイティブにサポートしていない古い Windows プラットフォームで使用されます。

IPv6 プロトコルは、Windows 2000 の IPv6 テクノロジ プレビューがインストールされている場合、Windows 2000 でサポートされます。 それ以外の場合、Windows XP より前のバージョンの Windows での getaddrinfo のサポートは、IPv4 名前解決の処理に限定されます。

addrinfoW 構造体を使用する GetAddrInfoW 関数は、getaddrinfo 関数と関連する addrinfo 構造体の Unicode バージョンです。 GetAddrInfoW 関数は、Service Pack 2 (SP2) を使用して Windows XP の Ws2_32.dll に追加されました。 GetAddrInfoW 関数と addrinfoW 構造体は、SP2 を使用する Windows XP より前のバージョンの Windows では使用できません。

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


#undef UNICODE

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

// link with Ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")

int __cdecl main(int argc, char **argv)
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData;
    int iResult;
    INT iRetval;

    DWORD dwRetval;

    int i = 1;
    
    struct addrinfo *result = NULL;
    struct addrinfo *ptr = NULL;
    struct addrinfo hints;

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

    char ipstringbuffer[46];
    DWORD ipbufferlength = 46;

    // Validate the parameters
    if (argc != 3) {
        printf("usage: %s <hostname> <servicename>\n", argv[0]);
        printf("       provides protocol-independent translation\n");
        printf("       from an ANSI host name to an IP address\n");
        printf("%s example usage\n", argv[0]);
        printf("   %s www.contoso.com 0\n", argv[0]);
        return 1;
    }

    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        printf("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;

    printf("Calling getaddrinfo with following parameters:\n");
    printf("\tnodename = %s\n", argv[1]);
    printf("\tservname (or port) = %s\n\n", argv[2]);
    
//--------------------------------
// Call getaddrinfo(). If the call succeeds,
// the result variable will hold a linked list
// of addrinfo structures containing response
// information
    dwRetval = getaddrinfo(argv[1], argv[2], &hints, &result);
    if ( dwRetval != 0 ) {
        printf("getaddrinfo failed with error: %d\n", dwRetval);
        WSACleanup();
        return 1;
    }

    printf("getaddrinfo returned success\n");
    
    // Retrieve each address and print out the hex bytes
    for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {

        printf("getaddrinfo response %d\n", i++);
        printf("\tFlags: 0x%x\n", ptr->ai_flags);
        printf("\tFamily: ");
        switch (ptr->ai_family) {
            case AF_UNSPEC:
                printf("Unspecified\n");
                break;
            case AF_INET:
                printf("AF_INET (IPv4)\n");
                sockaddr_ipv4 = (struct sockaddr_in *) ptr->ai_addr;
                printf("\tIPv4 address %s\n",
                    inet_ntoa(sockaddr_ipv4->sin_addr) );
                break;
            case AF_INET6:
                printf("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)
                    printf("WSAAddressToString failed with %u\n", WSAGetLastError() );
                else    
                    printf("\tIPv6 address %s\n", ipstringbuffer);
                break;
            case AF_NETBIOS:
                printf("AF_NETBIOS (NetBIOS)\n");
                break;
            default:
                printf("Other %ld\n", ptr->ai_family);
                break;
        }
        printf("\tSocket type: ");
        switch (ptr->ai_socktype) {
            case 0:
                printf("Unspecified\n");
                break;
            case SOCK_STREAM:
                printf("SOCK_STREAM (stream)\n");
                break;
            case SOCK_DGRAM:
                printf("SOCK_DGRAM (datagram) \n");
                break;
            case SOCK_RAW:
                printf("SOCK_RAW (raw) \n");
                break;
            case SOCK_RDM:
                printf("SOCK_RDM (reliable message datagram)\n");
                break;
            case SOCK_SEQPACKET:
                printf("SOCK_SEQPACKET (pseudo-stream packet)\n");
                break;
            default:
                printf("Other %ld\n", ptr->ai_socktype);
                break;
        }
        printf("\tProtocol: ");
        switch (ptr->ai_protocol) {
            case 0:
                printf("Unspecified\n");
                break;
            case IPPROTO_TCP:
                printf("IPPROTO_TCP (TCP)\n");
                break;
            case IPPROTO_UDP:
                printf("IPPROTO_UDP (UDP) \n");
                break;
            default:
                printf("Other %ld\n", ptr->ai_protocol);
                break;
        }
        printf("\tLength of this sockaddr: %d\n", ptr->ai_addrlen);
        printf("\tCanonical name: %s\n", ptr->ai_canonname);
    }

    freeaddrinfo(result);
    WSACleanup();

    return 0;
}

要件

要件
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
Header ws2def.h

こちらもご覧ください

GetAddrInfoW

WSAEnumProtocols

addrinfoW

bind

getaddrinfo

Sockaddr