다음을 통해 공유


HOSTENT 구조체(winsock.h)

호스트 구조는 호스트 이름, IPv4 주소 등과 같은 지정된 호스트에 대한 정보를 저장하는 함수에서 사용됩니다. 애플리케이션은 이 구조를 수정하거나 해당 구성 요소를 해제하려고 시도해서는 안 됩니다. 또한 호스트 구조의 복사본은 스레드당 하나만 할당되므로 애플리케이션은 다른 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] .

설명

gethostbyaddrgethostbyname 함수는 호스트 구조체에 대한 포인터(Windows 소켓에 의해 할당된 구조체)를 반환합니다. hostent 구조에는 이름 매개 변수에 지정된 호스트에 대한 성공적인 검색 결과가 포함됩니다.

gethostbyaddrgethostbyname 함수에서 반환된 호스트 구조체의 메모리는 스레드 로컬 스토리지의 Winsock DLL에 의해 내부적으로 할당됩니다. 스레드에서 gethostbyaddr 또는 gethostbyname 함수가 호출되는 횟수에 관계없이 단일 호스트 구조만 할당되고 사용됩니다. 동일한 스레드의 gethostbyaddr 또는 gethostbyname 함수에 대해 추가 호출을 수행해야 하는 경우 반환된 호스트 구조체를 애플리케이션 버퍼에 복사해야 합니다. 그렇지 않으면 반환 값은 동일한 스레드에서 후속 gethostbyaddr 또는 gethostbyname 호출에 의해 덮어씁니다. 반환된 호스트 구조에 할당된 내부 메모리는 스레드가 종료될 때 Winsock DLL에서 해제됩니다.

애플리케이션은 반환된 호스트 구조에서 사용하는 메모리를 해제하려고 시도해서는 안 됩니다 . 애플리케이션은 이 구조를 수정하거나 해당 구성 요소를 해제하려고 시도해서는 안 됩니다. 또한 이 구조체의 복사본은 스레드당 하나만 할당되므로 애플리케이션은 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[데스크톱 앱만]
머리글 winsock.h(Winsock2.h 포함)

추가 정보

GetAddrInfoEx

GetAddrInfoW

addrinfo

addrinfoW

getaddrinfo

gethostbyaddr

gethostbyname