GetNameInfoW 関数 (ws2tcpip.h)
GetNameInfoW 関数は、アドレスから Unicode ホスト名、およびポート番号から Unicode サービス名へのプロトコルに依存しない名前解決を提供します。
構文
INT WSAAPI GetNameInfoW(
[in] const SOCKADDR *pSockaddr,
[in] socklen_t SockaddrLength,
[out] PWCHAR pNodeBuffer,
[in] DWORD NodeBufferSize,
[out] PWCHAR pServiceBuffer,
[in] DWORD ServiceBufferSize,
[in] INT Flags
);
パラメーター
[in] pSockaddr
ソケットの IP アドレスとポート番号を含むソケット アドレス構造体へのポインター。 IPv4 の場合、pSockaddr パラメーターは sockaddr_in 構造体を指します。 IPv6 の場合、pSockaddr パラメーターは sockaddr_in6 構造体を指します。
[in] SockaddrLength
pSockaddr パラメーターが指す構造体の長さ (バイト単位)。
[out] pNodeBuffer
ホスト名を保持する Unicode 文字列へのポインター。 成功すると、Unicode ホスト名へのポインターが既定で完全修飾ドメイン名 (FQDN) として返されます。
[in] NodeBufferSize
pNodeBuffer パラメーターが指すバッファー内の WCHAR 文字の数。 呼び出し元は、Unicode ホスト名を保持するのに十分な大きさのバッファーを提供する必要があります (終端 NULL 文字を含む)。
[out] pServiceBuffer
サービス名を保持する Unicode 文字列へのポインター。 成功すると、ポート番号に関連付けられているサービス名を表す Unicode 文字列へのポインターが返されます。
[in] ServiceBufferSize
pServiceBuffer パラメーターが指すバッファー内の WCHAR 文字の数。 呼び出し元は、Unicode サービス名を保持するのに十分な大きさのバッファーを提供する必要があります(終端 NULL 文字を含む)。
[in] Flags
GetNameInfoW 関数の処理をカスタマイズするために使用される値。 「解説」セクションを参照してください。
戻り値
成功した場合、GetNameInfoW
GetNameInfoW 関数によって返される 0 以外のエラー コードも、インターネット エンジニアリング タスク フォース (IETF) の推奨事項で概説されている一連のエラーにマップされます。 次の表は、これらのエラー コードとその WSA に相当するものを示しています。 WSA エラー コードは、Winsock プログラマにとって使い慣れた包括的なエラー情報を提供するため、使用することをお勧めします。
エラー値 | WSA に相当する | 形容 |
---|---|---|
EAI_AGAIN | WSATRY_AGAIN | 名前解決で一時的なエラーが発生しました。 |
EAI_BADFLAGS | WSAEINVAL の |
GetNameInfoW 関数に 1 つ以上の無効なパラメーターが渡されました。 このエラーは、ホスト名が要求されたが、NodeBufferSize パラメーターが 0 であった場合、またはサービス名が要求されたが、ServiceBufferSize パラメーターが 0 であった場合に返されます。 |
EAI_FAIL | WSANO_RECOVERY | 名前解決で回復不可能なエラーが発生しました。 |
EAI_FAMILY | WSAEAFNOSUPPORT の |
pSockaddr パラメーターが指すソケット アドレス構造の sa_family メンバーはサポートされていません。 |
EAI_MEMORY | WSA_NOT_ENOUGH_MEMORY | メモリ割り当てエラーが発生しました。 |
EAI_NONAME | WSAHOST_NOT_FOUND | サービス名が要求されましたが、pSockaddr パラメーターが指す構造体にポート番号が見つかりませんでした。または、ポート番号と一致するサービス名が見つかりませんでした。 NI_NAMEREQDが設定され、ホストの名前が見つからないか、 |
gai_strerror 関数を使用すると、GetNameInfoW 関数によって返される EAI コードに基づいてエラー メッセージを出力できます。
gai_strerror 関数は IETF の推奨事項に準拠するために提供されますが、スレッド セーフではありません。 そのため、WSAGetLastError などの従来の Windows ソケット関数
さらに、次のエラー コードを返すことができます。
エラー コード | 意味 |
---|---|
|
このエラーは、 |
備考
GetNameInfoW 関数は、プロトコルに依存しない名前解決を提供する Unicode バージョンの関数です。 GetNameInfoW 関数は、ソケット アドレス構造の内容をノード名またはサービス名に変換するために使用されます。
IPv6 および IPv4 プロトコルの場合、名前解決はドメイン ネーム システム (DNS)、ローカル ホスト ファイル、またはその他の名前付けメカニズムによって行うことができます。 この関数を使用して、IPv4 または IPv6 アドレスのホスト名、逆引き DNS 参照、またはポート番号のサービス名を決定できます。 GetNameInfoW 関数を使用して、SOCKADDR 構造体の IP アドレスまたはポート番号を Unicode 文字列に変換することもできます。 この関数を使用して、ホスト名の IP アドレスを決定することもできます。
この関数の ANSI バージョンは getnameinfo
Winsock ヘッダー ファイル内のマクロは、アプリケーションが Service Pack 2 (SP2) 以降 (_WIN32_WINNT >= 0x0502) を対象としている場合に使用できる、GetNameInfo の大文字と小文字が混在する関数名を定義します。 この
#include <windows.h>
#define NI_MAXSERV 32
#define NI_MAXHOST 1025
Flags パラメーターを使用して、GetNameInfoW 関数の処理をカスタマイズできます。 次のフラグを使用できます。
- NI_NOFQDN
- NI_NUMERICHOST
- NI_NAMEREQD
- NI_NUMERICSERV
- NI_DGRAM
NI_NAMEREQD フラグを設定すると、DNS で解決できないホスト名がエラーになります。
NI_NOFQDN フラグを設定すると、pNodeBuffer パラメーターで返される相対識別名 (RDN) のみがローカル ホストになります。
NI_NUMERICHOST フラグを設定すると、ホスト名の名前ではなく数値形式が返されます。 ホスト名を DNS で解決できない場合は、ホスト名の数値形式も返されます。
NI_NUMERICSERV フラグを設定すると、サービスの名前ではなくポート番号が返されます。 また、IP アドレス (127.0.0.2 など) のホスト名が見つからない場合は、ホスト名が IP アドレスとして返されます。
Windows Vista 以降では、NI_NUMERICSERV が フラグ パラメーターで指定されておらず、sa パラメーターによって指 sockaddr 構造体に含まれるポート番号が既知のサービスに解決されない場合、GetNameInfoW 関数は、サービス アドレスの数値形式 (ポート番号) を数値文字列として返します。 NI_NUMERICSERV を指定すると、ポート番号が数値文字列として返されます。 この動作は、RFC 3493 のセクション 6.2 で指定されています。 詳細については、www.ietf.org/rfc/rfc3493.txt を参照してください。
Windows Server 2003 以前では、フラグ パラメーターに NI_NUMERICSERV が指定されておらず、sa パラメーターが指す sockaddr 構造体に含まれるポート番号が既知のサービスに解決されない場合、GetNameInfoW 関数は失敗します。 NI_NUMERICSERV を指定すると、ポート番号が数値文字列として返されます。
NI_DGRAM フラグを設定すると、サービスがデータグラム サービスであることを示します。 このフラグは、UDP および TCP サービスに異なるポート番号を提供するいくつかのサービスに必要です。
Windows Phone 8: この機能は、Windows Phone 8 以降の Windows Phone ストア アプリでサポートされています。
コード例
次の例では、GetNameInfoW 関数の使用を示します。#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")
int __cdecl main(int argc, char **argv)
{
//-----------------------------------------
// Declare and initialize variables
WSADATA wsaData;
int iResult;
DWORD dwRetval;
struct sockaddr_in saGNI;
WCHAR hostname[NI_MAXHOST];
WCHAR servInfo[NI_MAXSERV];
u_short port = 27015;
// Validate the parameters
if (argc != 2) {
wprintf(L"usage: %s IPv4 address\n", argv[0]);
wprintf(L" to return hostname\n");
wprintf(L" %s 127.0.0.1\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;
}
//-----------------------------------------
// Set up sockaddr_in structure which is passed
// to the getnameinfo function
saGNI.sin_family = AF_INET;
saGNI.sin_addr.s_addr = inet_addr(argv[1]);
saGNI.sin_port = htons(port);
//-----------------------------------------
// Call GetNameInfoW
dwRetval = GetNameInfoW((struct sockaddr *) &saGNI,
sizeof (struct sockaddr),
hostname,
NI_MAXHOST, servInfo, NI_MAXSERV, NI_NUMERICSERV);
if (dwRetval != 0) {
wprintf(L"GetNameInfoW failed with error # %ld\n", WSAGetLastError());
return 1;
} else {
wprintf(L"GetNameInfoW returned hostname = %ws\n", hostname);
return 0;
}
}
手記
ws2tcpip.h ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして GetNameInfo を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ] |
サポートされる最小サーバー | Windows Server 2003 [デスクトップ アプリ |UWP アプリ] |
ターゲット プラットフォーム の |
ウィンドウズ |
ヘッダー | ws2tcpip.h |
ライブラリ | Ws2_32.lib |
DLL | Ws2_32.dll |
関連項目
GetAddrInfoW の
WSAGetLastError の
getaddrinfo を
getnameinfo を
sockaddr を