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
IPv4(인터넷 프로토콜 버전 4) 주소 패밀리입니다.
AF_NETBIOS
17
NetBIOS 주소 패밀리입니다. 이 주소 패밀리는 NetBIOS용 Windows 소켓 공급자가 설치된 경우에만 지원됩니다.
AF_INET6
23
IPv6(인터넷 프로토콜 버전 6) 주소 패밀리입니다.

반환 값

없음

설명

gethostbyaddr 함수는 지정된 네트워크 주소에 해당하는 이름과 주소를 포함하는 호스트 구조체에 대한 포인터를 반환합니다.

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

애플리케이션은 반환된 호스트 구조에서 사용하는 메모리를 해제하려고 시도해서는 안 됩니다 . 애플리케이션은 이 구조를 수정하거나 해당 구성 요소를 해제하려고 시도해서는 안 됩니다. 또한 이 구조체의 복사본은 스레드당 하나만 할당되므로 애플리케이션은 gethostbyaddr 또는 gethostbyname에 대한 다른 함수 호출을 실행하기 전에 필요한 정보를 복사해야 합니다.

gethostbyaddr는 Windows Sockets 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 포함)
라이브러리 Ws2_32.lib
DLL Ws2_32.dll

참고 항목

GetAddrInfoEx

GetAddrInfoW

WSAAsyncGetHostByAddr

Winsock 함수

Winsock 참조

addrinfo

addrinfoW

getaddrinfo

gethostbyname

hostent