도메인이름으로 IP주소 얻기----------------------------------------------------------------------------------------
도메인 주소를 통해서 IP주소를 얻어올 수 있는 함수가 존재한다. 이 함수가 존재하면 서버의 IP주소로부터 클라이언트 프로그램은 자유로울 수 있다.
도메인 주소만 안다면 그를 통해서 현재 그 도메인주소에 해당하는 IP주소를 얻어올 수 있기 때문이다.
함수의 내용도 굉장히 간단하다.
-> 윈도우형 인자값으로 했으나 거의 차이가 없으므로 그대로 소개한다.
struct hostent* FAR gethostbyname(
_In_ const char *name -> 도메인 주소를 입력한다.
); -> 성공시 hostent 구조체 변수의 주소 값, 실패 시 NULL 포인터 반환
여기서 반환되는 구조체의 구조를 살펴보자,
struct hostent
{
char *h_name; /* Official name of host. */
char **h_aliases; /* Alias list. */
int h_addrtype; /* Host address type. */
int h_length; /* Length of address. */
char **h_addr_list; /* List of addresses from name server. */
#define h_addr h_addr_list[0] /* Address, for backward compatibility. */
};
struct hostent
{
char *h_name; /* Official name of host. */
-> 공식 도메인 이름
char **h_aliases; /* Alias list. */
-> 같은 메인페이지 인데도 다른 도메인 페이지로 접근하는 경우 공식 도메인 이름 이외에 해당 메인 페이지에 접속할 수 있는 다른 도메인 이름의 지정이 가능하다.
int h_addrtype; /* Host address type. */
->IPv4프로토콜 타입만 아니라 IPv6도 지원하기 때문에 h_addr_list로 반환된 IP주소의 주소체계에 대한 정보를 이 멤버를 통해 반환한다.
IPv4일 경우에는 AF_INET가 입력된다. IPv6의 경우에는 AF_INET6이 저장된다.
int h_length; /* Length of address. */
-> 함수 호출 결과로 반환된 IP주소의 크기 정보가 담긴다. IPv4는 4바이트 이므로 4가 저장되고 IPv6의 경우에는 16바이트 이므로 16이 저장된다.
char **h_addr_list; /* List of addresses from name server. */
-> 가장 중요한 맴버변수로 이 멤버를 통해서 도메인 이름에 대한 IP주소가 정수의 형태로 반환된다. 참고로 접속자수가 많은 서버는 하나의 도메인 이름에 대응하는 여러 IP를 두기 때문에 둘이상의 서버로 부하를 분산시키는 경우가 있는데 list가 의미하듯 이 맴버를 통해서 IP의 주소 정보를 모두 얻을 수 있다.
#define h_addr h_addr_list[0] /* Address, for backward compatibility. */
};
IP주소로 도메인 정보 얻기----------------------------------------------------------------------------------------
gethostbyname함수의 반대 역할을 한다고 보면 된다.
-> 윈도우형 인자값으로 했으나 거의 차이가 없으므로 그대로 소개한다.
struct hostent* FAR gethostbyaddr(
_In_ const char *addr,
_In_ int len,
_In_ int type
);
_In_ const char *addr, -> ip주소를 지니는 in_addr 구조체 변수의 포인터를 전달한다. IPv4 이외의 다양한 정보를 전달 받을 수 있도록 일반화하기 위해서 매개변수를 char형 포인터로 선언한다.
_In_ int len, -> 첫번째 인자로 전달된 주소정보의 길이다. IPv4는 4바이트 이므로 4를 전달하고 IPv6의 경우에는 16바이트 이므로 16이 전달한다.
_In_ int type -> 주소체계 정보 전달. IPv4일 경우에는 AF_INET가 입력된다. IPv6의 경우에는 AF_INET6이 전달한다.
'게임개발공부 > 서버 공부' 카테고리의 다른 글
열혈강의 TCP/IP <멀티 프로세스와 멀티 플렉싱> (0) | 2013.12.01 |
---|---|
열혈강의 TCP/IP <소켓의 옵션과 입출력 버퍼 소켓의 옵션 재설정> (0) | 2013.12.01 |
열혈강의 TCP/IP <연결 종료 방법> (0) | 2013.11.30 |
열혈강의 TCP/IP <UDP의 실제적인 데이터 입출력> (1) | 2013.11.30 |
열혈강의 TCP/IP <TCP의 실제적인 데이터 입출력> (0) | 2013.11.29 |