도메인이름으로 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이 전달한다.



Posted by JJOREG