gethostbyaddr 関数 (winsock.h)
[gethostbyaddr は、Windows ソケット 2 の時点で使用することは推奨されなくなりました。 代わりに、 getnameinfo.] を使用します。
gethostbyaddr 関数は、ネットワーク アドレスに対応するホスト情報を取得します。
構文
hostent * gethostbyaddr(
const char *addr,
int len,
int type
);
パラメーター
addr
TBD
len
TBD
type
TBD
戻り値
エラーが発生しない場合、 gethostbyaddr は ホスト型 構造体へのポインターを返します。 それ以外の場合は null ポインターを返し、 WSAGetLastError を呼び出すことで特定のエラー コードを取得できます。
エラー コード | 意味 |
---|---|
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。 | |
無効な引数が指定されました。 このエラーは、AF_INET6が型パラメーターで指定され、len パラメーターが IPv6 アドレスのサイズと等しく設定されていない場合に返されます。 | |
ネットワーク サブシステムが失敗しました。 | |
権限のある応答ホストが見つかりません。 | |
認証されていないホストが見つからないか、サーバーが失敗しました。 | |
回復不可能なエラーが発生しました。 | |
有効な名前。要求された型のデータ レコードはありません。 | |
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。 | |
指定された 型 は、Windows ソケットの実装ではサポートされていません。 | |
addr パラメーターがユーザー アドレス空間の有効な部分ではないか、len パラメーターが小さすぎます。 | |
ブロックしている Windows ソケット 1.1 呼び出しが WSACancelBlockingCall によって取り消されました。 |
注釈
gethostbyaddr 関数は、指定されたネットワーク アドレスに対応する名前とアドレスを含むホスト型構造体へのポインターを返します。
gethostbyaddr 関数によって返されるホスト型構造体のメモリは、スレッド ローカル ストレージから Winsock DLL によって内部的に割り当てられます。 スレッドで gethostbyaddr 関数または gethostbyname 関数が何回呼び出されても、1 つのホスト型構造体のみが割り当てられ、使用されます。 同じスレッド上の gethostbyaddr 関数または gethostbyname 関数に対して追加の呼び出しを行う場合は、返されたホスト型構造体をアプリケーション バッファーにコピーする必要があります。 それ以外の場合、戻り値は、同じスレッド上の後続の gethostbyaddr または gethostbyname 呼び出しによって上書きされます。 返された ホスト型 構造体に割り当てられた内部メモリは、スレッドの終了時に Winsock DLL によって解放されます。
アプリケーションは、返された ホスト 型構造体によって使用されるメモリを解放しようとしないでください。 アプリケーションは、この構造を変更したり、そのコンポーネントを解放したりしないでください。 さらに、この構造体のコピーはスレッドごとに 1 つだけ割り当てられるため、アプリケーションは 、gethostbyaddr または gethostbyname への他の関数呼び出しを発行する前に、必要な情報をコピーする必要があります。
gethostbyaddr は Windows ソケット 2 の時点で使用することは推奨されなくなりましたが、getnameinfo 関数を使用する必要がありますが、gethostbyaddr は NetBIOS 名を返す機能があります。getnameinfo はではありません。 NetBIOS の名前解決を必要とする開発者は、アプリケーションが NetBIOS 名から完全に独立するまで gethostbyaddr を使用する必要がある場合があります。
コード例
次の例では、 gethostbyaddr 関数の使用方法を示します。#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
int main(int argc, char **argv)
{
//-----------------------------------------
// Declare and initialize variables
WSADATA wsaData;
int iResult;
DWORD dwError;
int i = 0;
int bIpv6 = 0;
struct hostent *remoteHost;
char *host_addr;
struct in_addr addr = { 0 };
IN6_ADDR addr6;
char **pAlias;
// Validate the parameters
if (argc < 2) {
printf("usage: %s 4 ipv4address\n", argv[0]);
printf(" or\n");
printf("usage: %s 6 ipv6address\n", argv[0]);
printf(" to return the hostname\n");
printf(" %s 4 127.0.0.1\n", argv[0]);
printf(" %s 6 0::1\n", argv[0]);
return 1;
}
// Validate parameters
if (atoi(argv[1]) == 4)
bIpv6 = 0;
else if (atoi(argv[1]) == 6)
bIpv6 = 1;
else {
printf("usage: %s 4 ipv4address\n", argv[0]);
printf(" or\n");
printf("usage: %s 6 ipv6address\n", argv[0]);
printf(" to return the hostname\n");
printf(" %s 4 127.0.0.1\n", argv[0]);
printf(" %s 6 0::1\n", argv[0]);
return 1;
}
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
host_addr = argv[2];
printf("Calling gethostbyaddr with %s\n", host_addr);
if (bIpv6 == 1) {
{
iResult = inet_pton(AF_INET6, host_addr, &addr6);
if (iResult == 0) {
printf("The IPv6 address entered must be a legal address\n");
return 1;
} else
remoteHost = gethostbyaddr((char *) &addr6, 16, AF_INET6);
}
} else {
addr.s_addr = inet_addr(host_addr);
if (addr.s_addr == INADDR_NONE) {
printf("The IPv4 address entered must be a legal address\n");
return 1;
} else
remoteHost = gethostbyaddr((char *) &addr, 4, AF_INET);
}
if (remoteHost == NULL) {
dwError = WSAGetLastError();
if (dwError != 0) {
if (dwError == WSAHOST_NOT_FOUND) {
printf("Host not found\n");
return 1;
} else if (dwError == WSANO_DATA) {
printf("No data record found\n");
return 1;
} else {
printf("Function failed with error: %ld\n", dwError);
return 1;
}
}
} else {
printf("Function returned:\n");
printf("\tOfficial name: %s\n", remoteHost->h_name);
for (pAlias = remoteHost->h_aliases; *pAlias != 0; pAlias++) {
printf("\tAlternate name #%d: %s\n", ++i, *pAlias);
}
printf("\tAddress type: ");
switch (remoteHost->h_addrtype) {
case AF_INET:
printf("AF_INET\n");
break;
case AF_INET6:
printf("AF_INET6\n");
break;
case AF_NETBIOS:
printf("AF_NETBIOS\n");
break;
default:
printf(" %d\n", remoteHost->h_addrtype);
break;
}
printf("\tAddress length: %d\n", remoteHost->h_length);
if (remoteHost->h_addrtype == AF_INET) {
while (remoteHost->h_addr_list[i] != 0) {
addr.s_addr = *(u_long *) remoteHost->h_addr_list[i++];
printf("\tIPv4 Address #%d: %s\n", i, inet_ntoa(addr));
}
} else if (remoteHost->h_addrtype == AF_INET6)
printf("\tRemotehost is an IPv6 address\n");
}
return 0;
}
Windows Phone 8: この関数は、Windows Phone 8 以降のWindows Phone ストア アプリでサポートされています。
Windows 8.1とWindows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 8.1、 Windows Vista [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | winsock.h (Winsock2.h、Winsock.h を含む) |
Library | Ws2_32.lib |
[DLL] | Ws2_32.dll |