도메인, 옵션

with MK·2020년 10월 27일
0

소켓 프로그래밍

목록 보기
13/13

IP주소와 도메인 이름 사이에 변환을 수행하는 시스템을 DNS(Domain Name System)이라 한다.
인터넷에서 서비스를 제공하는 서버들에 도메인 이름을 IP 주소 대신 사용한다.

DNS 서버

도메인 이름은 해당 서버에 부여된 가상의 주소이지 실제주소가 아니다.
모든 컴퓨터에는 디폴트 DNS 서버의 주소가 등록되어 있는데, 이를 이용하여 도메인 이름에 대한 IP 주소 정보를 얻게 된다.
디폴트 DNS 서버는 자신이 모르는 정보에 대한 요청이 들어오면 한단계 상위 계층에 있는 DNS 서버에게 물어본다.

왜 필요한가

IP주소는 언제든 바뀔 수 있는 반면에, 도메인 이름은 일단 등록하고나면 평생 유지가 가능하니, 이를 이용해서 코드를 작성하는 편이 나을 수 있다.

도메인 이름으로 IP주소 얻어오기

#include <netdb.h>
struct hostent * gethostbyname(const char * hostname);

해당 함수는 성공 시 hostent 구조체 변수의 주소 값을, 실패 시 NULL 포인터를 반환한다.

hostent 구조체는 다음과 같이 정의되어 있다.

struct hostent{
    char * h_name; // 공식 도메인 이름
    char ** h_aliases; // 도메인 이름이 여러 개인 경우
    int h_addrtype; // 주소체계에 대한 정보
    int h_length; // 주소의 크기 정보
    char ** h_addr_list; // 정수형태의 주소 반환
}

도메인 이름을 IP로 변환하는 경우 h_addr_list만 신경 쓰면 된다.
해당 멤버는 도메인 이름에 대한 IP주소가 정수 형태로 반환된다. 접속자수가 많은 서버의 경우 여러 IP를 두고, 둘 이상의 서버로 부하를 분산시킬 수 있는데, 이러한 경우에도 이 멤버를 통해서 모든 IP 주소정보를 얻을 수 있다.

h_addr_list가 가리키는 것은 문자열 포인터 배열이다. 그러나 문자열 포인터 배열이 실제 가리키는 것은 문자열의 주소 값이 아닌 in_addr 구조체 변수의 주소 값이다.

IP주소를 통해 도메인 정보 얻어오기

struct hostent * gethostbyaddr(const char * addr, socklen_t len, int family);

소켓의 다양한 옵션

0개의 댓글