GETHOSTBYNAME(3)

이름
gethostbyname, gethostbyaddr, sethostent, endhostent, herror, hstrerror - 네트웍 호스트 엔트리를 가져온다.

사용법
#include <netdb.h>
extern int h_errno;

struct hostent *gethostbyname(const char *name);

#include <sys/socket.h>        /* for AF_INET */
struct hostent *gethostbyaddr(const char *addr,
  int len, int type);

void sethostent(int stayopen);

void endhostent(void);

void herror(const char *s);

const char * hstrerror(int err);

설명
gethostbyname() 함수는 주어진 호스트 name 에 상응하는 hostent 타입의 구조체를 반환한다. 여기서 name은 호스트 이름이거나 표준 점 표기법의 IPv4 주소이거나, 콜론(그리고 점 표기법도 가능)표기법의 IPv6이다. (IPv6에 대한 기술을 위해 RFC1884를 참조해라.) 만일 name 이 IPv4나 IPv6 주소라면, 어떤 룩업도 행해지지 않고 gethostbyname()는 단순히 name 을 h_name 필드에 복사하고 해당 struct in_addr 를 반환하는 hostent 구조체의 h_addr_list[0] 필드에 복사한다. 만일 name가 점으로 끝나지 않고 환경 변수 HOSTALIASES가 설정되어 있다면, HOSTALIASES가 가리키는 얼라이싱 파일이 name을 위해 우선 탐색된다. (파일 형식을 위해 hostname(7)을 참조해라.) 현재 도메인과 상위 도메인은 name이 점으로 끝나지 않는다면 탐색된다.

gethostbyaddr() 함수는 길이 len 그리고 주소 타입 type인 호스트 주소 addr에 해당하는 hostent 구조체를 리턴한다. 유일하게 유효한 주소 타입은 현재 AF_INET이다.

만일 stayopen가 참(1)이라면, sethostent() 함수는 연결된 TCP 소켓이 네임 서버 질의를 위해 사용되어야 한다는것을 가리킨다. 그리고 연결은 연속적은 질의를 동안 계속 열려 있어야 한다. 그렇지 않으면, 네임 서버 질의를 UDP 데이터그램을 사용할 것이다.

endhostent() 함수는 네임 서버 질의를 위한 TCP 연결의 사용을 끝낸다.

(구식) herror() 함수는 stderr에 현재 값의 h_errno 에 상응하는 에러 메세지를 출력한다.

(구식) hstrerror() 함수는 에러(전형적으로 h_errno) 넘버를 가지며 상응하는 메세지를 반환한다.

도메인 네임 질의는 gethostbyname() 에 의해 수행되며 gethostbyaddr()는 /etc/host.conf에 있는 order라인의 내용에 의존하여 /etc/hosts에서 라인을 뽑아내 네임 서버 named(8)의 일부나 모두의 조합과 네트웍 정보 서비스 (NIS 또는 YP)를 사용한다. ( resolv+(8)를 참조해라.) 기본 행동은 /etc/hosts 다음에 named(8)에 질의하는 것이다.

hostent 구조체는 다음과 같이 <netdb.h>에 정의되어 있다:

    struct hostent {
    	char	*h_name;		/* 호스트의 공식 이름 */
    	char	**h_aliases;		/* 별칭 리스트 */
    	int	h_addrtype;		/* 호스트 주소 타입 */
    	int	h_length;		/* 주소의 길이 */
    	char	**h_addr_list;		/* 주소 리스트 */
    }
    #define h_addr	h_addr_list[0]		/* 구 버전과의 호환을 위해 */

hostent 구조체의 멤버는:

h_name
    호스트의 공식적인 이름

h_aliases
    호스트를 위해 널로 끝나는 선택적인 이름의 배열

h_addrtype
    주소 타입; 현재는 항상 AF_INET 이다.

h_length
    바이트로 주소의 길이.

h_addr_list
    네트웍 바이트 순서로 호스트를 위한 널로 종료된 네트웍 주소 배열

h_addr
    예전과의 호환을 위해 h_addr_list의 처음 주소

반환값
gethostbyname() 그리고 gethostbyaddr() 함수는 hostent 구조체를 반환하거나 만일 에러가 발생한다면 NULL 포인터를 반환한다. 에러시, h_errno 변수는 에러 넘버를 가진다.

에러
변수 h_errno는 다음 값들을 가진다:

HOST_NOT_FOUND
    지정된 호스트가 알려지지 않았다.

NO_ADDRESS 나 NO_DATA
    요구한 이름이 유효하지만 IP 주소를 가지지 않는다.

NO_RECOVERY
    복구 될수 없는 네임 서버 에러가 발생했다.

TRY_AGAIN
    임시적 에러로 네임서버 인증시 발생했다. 다시 시도해라.

파일

/etc/host.conf
    해석 설정 파일.

/etc/hosts
    호스트 데이터 베이스 파일

호환
BSD 4.3.

주의
SUS-v2 표준은 버그이며, len 인자를 size_t 타입으로 선언하였다.(이것은 잘못된 것이다. 왜냐하면 그것은 int 이지 size_t 가 아니기 때문이다. Austin 초안은 socklen_t으로 했으며 이것은 가능하다.)

Glibc2는 또한 gethostbyname()처럼 작동하는

struct hostent *gethostbyname2(const char *name, int af);

를 가지고 있다. 그러나 그것은 주소가 속해 있는 주소 가족을 지정하도록 한다.

Austin 초안은 gethostbyaddr() 과 gethostbyname() 를 상속하는 함수를 만들었으며 다음과 같이 소개하였다.

struct hostent *getipnodebyaddr (const void *restrict addr,
  socklen_t len, int type, int *restrict error_num);

struct hostent *getipnodebyname (const char *name,
  int type, int flags, int *error_num);

관련 항목
resolver(3), hosts(5), hostname(7), resolv+(8), named(8)

역자
정강훈 <skyeyes@soback.kornet.net>, 2001년 4월 30일