gethostbyaddr 関数 (winsock2.h)

[gethostbyaddr は、Windows ソケット 2 の時点で使用することは推奨されなくなりました。 代わりに、 getnameinfo.] を使用します。

gethostbyaddr 関数は、ネットワーク アドレスに対応するホスト情報を取得します。

構文

hostent *WSAAPI gethostbyaddr(
  const char *addr,
  int        len,
  int        type
);

パラメーター

addr

TBD

len

TBD

type

TBD

戻り値

エラーが発生しない場合、 gethostbyaddrホスト型 構造体へのポインターを返します。 それ以外の場合は null ポインターを返し、 WSAGetLastError を呼び出すことで特定のエラー コードを取得できます。

エラー コード 意味
WSANOTINITIALIZED
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。
WSAEINVAL
無効な引数が指定されました。 このエラーは、AF_INET6が型パラメーターで指定され、len パラメーターが IPv6 アドレスのサイズと等しく設定されていない場合に返されます。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAHOST_NOT_FOUND
権限のある応答ホストが見つかりません。
WSATRY_AGAIN
認証されていないホストが見つからないか、サーバーが失敗しました。
WSANO_RECOVERY
回復不可能なエラーが発生しました。
WSANO_DATA
有効な名前。要求された型のデータ レコードはありません。
WSAEINPROGRESS
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEAFNOSUPPORT
指定された は、Windows ソケットの実装ではサポートされていません。
WSAEFAULT
addr パラメーターがユーザー アドレス空間の有効な部分ではないか、len パラメーターが小さすぎます。
WSAEINTR
ブロックしている 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 関数を使用して逆引き参照を実行する機能は便利ですが、このような参照は本質的に信頼性が低いと見なされ、ヒントとしてのみ使用する必要があります。
 

コード例

次の例では、 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.1Windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。

要件

要件
サポートされている最小のクライアント Windows 8.1、 Windows Vista [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ]
対象プラットフォーム Windows
ヘッダー winsock2.h (Winsock2.h、Winsock.h を含む)
Library Ws2_32.lib
[DLL] Ws2_32.dll

こちらもご覧ください

GetAddrInfoEx

GetAddrInfoW

WSAAsyncGetHostByAddr

Winsock 関数

Winsock リファレンス

addrinfo

addrinfoW

getaddrinfo

gethostbyname

hostent