다음을 통해 공유


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를 호출하여 특정 오류 코드를 검색할 수 있습니다.

오류 코드 의미
WSANOTINITIALISED
이 함수를 사용하기 전에 성공적인 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
WSACancelBlockingCall을 통해 차단 Windows 소켓 1.1 호출이 취소되었습니다.

설명

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
헤더 winsock2.h(Winsock2.h, Winsock.h 포함)
라이브러리 Ws2_32.lib
DLL Ws2_32.dll

추가 정보

GetAddrInfoEx

GetAddrInfoW

WSAAsyncGetHostByAddr

Winsock 함수

Winsock 참조

addrinfo

addrinfoW

getaddrinfo

gethostbyname

hostent