2011. 7. 29. 14:58
도메인 이름을 이용해서 IP 주소 얻어오기
다음 함수를 이용하면 문자열 형태의 도메인 이름으로부터 IP주소정보를 얻어올 수 있다.

#include <netdb.h>

struct hostent * gethostbyname(const char * hostname);
    =>성공시 hostent 구조체 변수의 주소 값, 실패 시 NULL 포인터 반환

struct hostent //hostent구조체
{
      char * h_name;         // official name
      char ** h_aliases;     // alias list
      int h_addrtype;          // host address type
      int h_length;              // address length
      char ** h_addr_list;    // address list
h_name
이 멤버에는 '공식 도메인 이름(Official domain name)'이 저장된다.
h_aliases
하나의 IP에 둘 이상의 도메인 이름을 지정하는 것이 가능하기 때문에, 공식 도메인 이외에 해당 메인 페이지를 접속할 수 있는 다른 도메인 이름의 지정이 가능.(h_aliases를 통해 얻을 수있음)
h_addrtype
gethostbyname은 IPv4뿐만 아니라 IPv6도 지원. 때문에 h_addr_list로 반환된 IP주소체계에 대한 정보를 이 멤버를 통해 반환
(IPv4경우 AF_INET반환)
h_length
함수 호출의 결과로 반환된 IP주소의 크기.(IPv4경우 4바이트)
h_addr_list
이 멤버를 통해서 도메인 이름에 대한 IP주소가 정수의 형태로 반환
(참로 : 접속자수가 많은 서버는 하나의 도메인 이름에 대응하는 IP를 여러개 둬서, 둘 이상의 서버로 분산시킬 수 있는데, 이러한 경우에도 이 멤버를 통해서 모든 IP의 주소를 얻어올 수 있다.)



예제소스_ gethostbyname.c




예제결과_gethostbyname www.google.com






IP주소를 이용해서 도메인 정보 가져오기
 #include <netdb.h>

struct hostent * gethostbyaddr(const char * addr, socklen_t len, int family);
     => 성공시 hostent 구조체 변수의 주소값, 실패시 NULL포인터 반환
인자설명
addr : IP주소를 지니는 in_addr 구조체 변수의 포인터 전달, IPv4이외의 다양한 정보를 전달받을 수 있도록 일반화하기 위해서 매개변수 char형 포인터로 선언
len : 첫 번째 인자로 전달된 주소정보의 길이, IPv4의 경우 4, IPv6의 경우 16전달.
family : 주소체계 정보 전달. IPv4의 경우 AF_INET, IPv6의 경우 AF_INET6전달
ex) host = gethostbyaddr((char*)&addr.sin_addr, 4, AF_INET);

예제: gethostbyaddr.c




출처 : 열혈강의tcp/ip 소켓 프로그래밍_윤성우

Posted by Triany