gethostbyaddr マクロ (wsipv6ok.h)

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

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

構文

void gethostbyaddr(
  [in]  a,
  [in]  b,
  [in]  c
);

パラメーター

[in] a

ネットワーク バイト順のアドレスへのポインター。

[in] b

アドレスの長さ (バイト単位)。

[in] c

AF_INET アドレス ファミリの種類 (TCP、UDP、およびその他の関連するインターネット プロトコルで使用) などのアドレスの種類。 アドレス ファミリに使用できる値は、Winsock2.h ヘッダー ファイルで定義されています。

Windows Vista 以降用にリリースされた Windows SDK では、ヘッダー ファイルのorganizationが変更され、アドレス ファミリに使用できる値は Ws2def.h ヘッダー ファイルで定義されます。 Ws2def.h ヘッダー ファイルは Winsock2.h に自動的に含まれるので、直接使用しないでください。

AF_ アドレス ファミリ定数とPF_ プロトコル ファミリ定数の値は同一であるため ( たとえば、AF_INETPF_INET)、どちらの定数も使用できます。

次の表に、サポートされているアドレス ファミリに使用できる値を示します。

説明
AF_INET
2
インターネット プロトコル バージョン 4 (IPv4) アドレス ファミリ。
AF_NETBIOS
17
NetBIOS アドレス ファミリ。 このアドレス ファミリは、NetBIOS 用 Windows ソケット プロバイダーがインストールされている場合にのみサポートされます。
AF_INET6
23
インターネット プロトコル バージョン 6 (IPv6) アドレス ファミリ。

戻り値

なし

解説

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
ヘッダー wsipv6ok.h (Winsock2.h、Winsock.h を含む)
Library Ws2_32.lib
[DLL] Ws2_32.dll

関連項目

GetAddrInfoEx

GetAddrInfoW

WSAAsyncGetHostByAddr

Winsock 関数

Winsock リファレンス

addrinfo

addrinfoW

getaddrinfo

gethostbyname

hostent