HOSTENT 構造体 (winsock.h)

ホスト型構造体は、ホスト名、IPv4 アドレスなど、特定のホストに関する情報を格納するために関数によって使用されます。 アプリケーションは、この構造を変更したり、そのコンポーネントを解放したりしないでください。 さらに、 ホスト型 構造体のコピーはスレッドごとに 1 つだけ割り当てられるため、アプリケーションは、他の Windows ソケット API 呼び出しを発行する前に、必要な情報をコピーする必要があります。

構文

typedef struct hostent {
  char  *h_name;
  char  **h_aliases;
  short h_addrtype;
  short h_length;
  char  **h_addr_list;
} HOSTENT, *PHOSTENT, *LPHOSTENT;

メンバー

h_name

ホスト (PC) の正式な名前。 DNS または同様の解決システムを使用している場合、サーバーが応答を返す原因となったのは完全修飾ドメイン名 (FQDN) です。 ローカル ホスト ファイルを使用する場合は、IPv4 アドレスの後の最初のエントリになります。

h_aliases

代替名の NULL で終わる配列。

h_addrtype

返されるアドレスの種類。

h_length

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

h_addr_list

ホストの アドレスの NULL で終わるリスト。 アドレスはネットワークのバイト順で返されます。 マクロ h_addr は、古いソフトウェアとの互換性のために 定義されています h_addr_list[0]

注釈

gethostbyaddr 関数と gethostbyname 関数は、ホスト型構造体 (Windows ソケットによって割り当てられた構造体) へのポインターを返します。 hostent 構造体には、name パラメーターで指定されたホストが正常に検索された結果が含まれます。

gethostbyaddr 関数と gethostbyname 関数によって返されるホスト型構造体のメモリは、スレッド ローカル ストレージから Winsock DLL によって内部的に割り当てられます。 スレッドで gethostbyaddr 関数または gethostbyname 関数が何回呼び出されても、1 つのホスト型構造体のみが割り当てられ、使用されます。 同じスレッド上の gethostbyaddr 関数または gethostbyname 関数に対して追加の呼び出しを行う場合は、返されるホスト型構造体をアプリケーション バッファーにコピーする必要があります。 それ以外の場合、戻り値は、同じスレッドで後続の gethostbyaddr または gethostbyname 呼び出しによって上書きされます。 返された ホスト型 構造体に割り当てられた内部メモリは、スレッドの終了時に Winsock DLL によって解放されます。

アプリケーションは、返された ホスト 型構造体によって使用されるメモリを解放しないでください。 アプリケーションは、この構造を変更したり、そのコンポーネントを解放したりしてはなりません。 さらに、この構造体のコピーはスレッドごとに 1 つだけ割り当てられるため、アプリケーションは 、gethostbyaddr または gethostbyname に対して他の関数呼び出しを発行する前に、必要な情報をコピーする必要があります。

次の例では、gethostbyname 関数でホスト型構造体を使用する方法を示します。

#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")

int main(int argc, char **argv)
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData;
    int iResult;

    DWORD dwError;
    int i = 0;

    struct hostent *remoteHost;
    char *host_name;
    struct in_addr addr;

    char **pAlias;

    // Validate the parameters
    if (argc != 2) {
        printf("usage: %s ipv4address\n", argv[0]);
        printf(" or\n");
        printf("       %s hostname\n", argv[0]);
        printf("  to return the host\n");
        printf("       %s 127.0.0.1\n", argv[0]);
        printf("  to return the IP addresses for a host\n");
        printf("       %s www.contoso.com\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_name = argv[1];

// If the user input is an alpha name for the host, use gethostbyname()
// If not, get host by addr (assume IPv4)
    if (isalpha(host_name[0])) {        /* host address is a name */
        printf("Calling gethostbyname with %s\n", host_name);
        remoteHost = gethostbyname(host_name);
    } else {
        printf("Calling gethostbyaddr with %s\n", host_name);
        addr.s_addr = inet_addr(host_name);
        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 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
Header winsock.h (Winsock2.h を含む)

こちらもご覧ください

GetAddrInfoEx

GetAddrInfoW

addrinfo

addrinfoW

getaddrinfo

gethostbyaddr

gethostbyname