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_canonname メンバーで返されます。 |
|
GetAddrInfoW 関数に渡される nodename パラメーターは、数値文字列である必要があります。 |
|
このビットが設定されている場合、AI_V4MAPPEDを 持つ IPv6 アドレスと IPv4 アドレスに対して要求が行われます。
このオプションは、Windows Vista 以降でサポートされています。 |
|
GetAddrInfoW は、グローバル アドレスが構成されている場合にのみ解決されます。 IPv6 および IPv4 ループバック アドレスは、有効なグローバル アドレスとは見なされません。 このオプションは、Windows Vista 以降でのみサポートされています。 |
|
IPv6 アドレスに対 する GetAddrInfoW 要求が失敗した場合、IPv4 アドレスに対してネーム サービス要求が行われ、これらのアドレスは IPv4 マップされた IPv6 アドレス形式に変換されます。
このオプションは、Windows Vista 以降でサポートされています。 |
|
アドレス情報は、権限のない名前空間プロバイダーから取得できます。
このオプションは、Windows Vista 以降の NS_EMAIL 名前空間でのみサポートされます。 |
|
アドレス情報は、セキュリティで保護されたチャネルからの情報です。
このオプションは、Windows Vista 以降の NS_EMAIL 名前空間でのみサポートされます。 |
|
アドレス情報は、ユーザーの優先名を表します。
このオプションは、Windows Vista 以降の NS_EMAIL 名前空間でのみサポートされます。 |
|
フラット名 (単一ラベル) が指定されている場合、 GetAddrInfoW は名前が最終的に解決された完全修飾ドメイン名を返します。 完全修飾ドメイン名は、 ai_canonname メンバーで返されます。
これは、DNS に登録されている正規名を返す AI_CANONNAME ビット フラグとは異なります。これは、フラット名が解決された完全修飾ドメイン名とは異なる場合があります。 設定できるのは、 AI_FQDN ビットと AI_CANONNAME ビットの 1 つだけです。 両方のフラグがEAI_BADFLAGSと共に存在する場合、GetAddrInfoW 関数は失敗します。 このオプションは、Windows 7、Windows Server 2008 R2 以降でサポートされています。 |
|
クエリ対象のホスト名がファイル共有シナリオで使用されていることを示す名前空間プロバイダーへのヒント。 名前空間プロバイダーは、このヒントを無視できます。
このオプションは、Windows 7、Windows Server 2008 R2 以降でサポートされています。 |
|
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_UNSPEC と PF_UNSPEC)、どちらの定数も使用できます。
次の表に、アドレス ファミリの一般的な値を示しますが、他の多くの値を使用できます。
ai_socktype
型: int
ソケットの種類。 ソケットの種類に使用できる値は、 Winsock2.h インクルード ファイルで定義されています。
次の表に、Windows Sockets 2 でサポートされているソケットの種類に使用できる値を示します。
値 | 意味 |
---|---|
|
OOB データ転送メカニズムを使用して、シーケンス化された信頼性の高い双方向の接続ベースのバイト ストリームを提供します。 インターネット アドレス ファミリ (AF_INET または AF_INET6) に伝送制御プロトコル (TCP) を使用します。 ai_family メンバーがAF_IRDA場合、サポートされているソケットの種類は SOCK_STREAM のみです。 |
|
固定 (通常は小さい) 最大長のコネクションレスで信頼性の低いバッファーであるデータグラムをサポートします。 インターネット アドレス ファミリ (AF_INET または AF_INET6) にユーザー データグラム プロトコル (UDP) を使用します。 |
|
アプリケーションが次の上位層プロトコル ヘッダーを操作できるようにする生ソケットを提供します。 IPv4 ヘッダーを操作するには、 ソケットで IP_HDRINCL ソケット オプションを設定する必要があります。 IPv6 ヘッダーを操作するには、 ソケットに IPV6_HDRINCL ソケット オプションを設定する必要があります。 |
|
信頼性の高いメッセージ データグラムを提供します。 この種類の例として、Windows でのプラグマティック一般マルチキャスト (PGM) マルチキャスト プロトコルの実装があります。これは、 信頼性の高いマルチキャスト プログラミングと呼ばれることがよくあります。 |
|
データグラムに基づいて擬似ストリーム パケットを提供します。 |
Windows ソケット 2 では、新しいソケットの種類が導入されました。 アプリケーションは、 WSAEnumProtocols 関数を使用して、使用可能な各トランスポート プロトコルの属性を動的に検出できます。 そのため、アプリケーションはアドレス ファミリで使用できるソケットの種類とプロトコルのオプションを決定し、このパラメーターを指定するときにこの情報を使用できます。 Winsock2.h ヘッダー ファイルと Ws2def.h ヘッダー ファイルのソケットの種類の定義は、新しいソケットの種類、アドレス ファミリ、およびプロトコルが定義されると定期的に更新されます。
Windows ソケット 1.1 では、使用可能なソケットの種類は SOCK_DATAGRAM と SOCK_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 メンバーの一般的な値を示しています。
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が定義されている場合、 ADDRINFOT は addrinfoW 構造体に定義され、 GetAddrInfo はこの関数の Unicode バージョンである GetAddrInfoW に定義されます。 UNICODE または_UNICODEが定義されていない場合、 ADDRINFOT は addrinfo 構造体に定義され、 GetAddrInfo は、この関数の ANSI バージョンである getaddrinfo に対して定義されます。
GetAddrInfoW を正常に呼び出すと、GetAddrInfoW 関数に渡される ppResult パラメーターに ADDRINFOW 構造体のリンクされたリストが返されます。 リストは、NULL ポインターが検出されるまで、返された各 ADDRINFOW 構造体のai_next メンバーに指定されたポインターに従って処理できます。 返される各 ADDRINFOW 構造体では、 ai_family、 ai_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 を含む) |