기억하기 어려운 IP주소 대신 도메인 이름을 부여해 IP주소를 대신
도메인 이름은 해당 서버에 부여된 가상의 주소, 실제 주소가 아니다
가상의 주소를 실제 주소로 변환하는 과정을 거쳐야함!
디폴트 DNS 서버를 통해 도메인 네임에 대한 IP주소 정보를 얻음
그러나 디폴트 DNS 서버가 모든 도메인의 IP주소를 알지는 못한다
그러면 어떡해??
모르면 물어서라도 가르쳐준다.
상위 계층에 있는 DNS서버에게 모르는 정보를 물어본다.
제일 상위 = ROOT DNS서버까지 올라가 정보를 알아냄
서버 계층은 다양함 com, org, edu 등 나뉘어져 있다
EX) 클라이언트가 www.amazon.com의 IP를 원할떄
IP주소는 복잡하고 어렵고 도메인 네임에 비해 변경 확률이 높다.
반면 도메인 이름은 등록하면 평생 유지가 가능하다.
이를 이용해 도메인 네임을 이용해 해당 IP주소를 얻어 프로그램의 서버에 접속을 한다면 IP주소로 부터 클라이언트는 자유롭다
=> IP주소와 도메인 네임 사이 변환 함수가 필요!!
문자열 도메인 이름 -> IP 주소 정보
struct hostent* gethostbyname(const char* hostname);
변환되는 IP주소가 담기는 구조체이다
struct hostent{
char* h_name; // 공식 도메인 네임
char** h_aliases; // 공식 도메인 이외 해당 페이지에 접속 가능한 다른 도메인 이름
int h_addrtype; // 주소 타입 AF_INET or AF_INET6
int h_length; // IP주소의 크기 정보, IPv4 = 4 IPv6 = 16
char** h_addr_list; // IP주소
}
구조체 변수 구조
hostent에서 h_addr_list 출력하는 법
printf("%s",inet_ntoa(*(struct in_addr*)host->h_addr_list[i]);
hostent구조체에서 h_addr_list는 문자열 배열이다.
하지만 실제 문자열 배열이 가리키는 값은 문자열의 주소 값이 아닌 in_addr 구조체 변수의 주소값이다!!
위의 구조체의 구조 그림을 본다면 h_addr_list 배열에서 다시 in_addr을 가리키는 것을 볼 수 있다
=> 그래서 inet_ntoa 함수로 변환을 해야한다
IP주소 -> 도메인 정보
struct hostent* gethostbyaddr(const char* addr,socklen_t len,int family);
성공시 hostent 구조체 주소값(포인터로 받아!), 실패시 NULL 포인터 반환
addr: IP주소를 가지는 in_addr 구조체 변수의 포인터
len: addr의 길이 IPv4 = 4, IPv6 = 16
family: 주소체계 정보 전달, IPv4 = AF_INET, IPv6 = AF_INET6
위에 함수와 똑같이 사용하면 됨. hostent 구조체를 통해 값을 받아오니깐.. 단지 차이는 IP를 이용해 도메인 정보를 얻는당...