인공지능실험실 박사 1학기 장성만 smjang@ai.hannam.ac.kr TCP/IP Socket Programming… 제 8장 도메인 이름과 인터네 주소 인공지능실험실 박사 1학기 장성만 smjang@ai.hannam.ac.kr
목차 DNS(Domain Name System) IP 주소와 도메인 이름 사이의 변환 윈도우 기반으로 구현하기
DNS(Domain Name System) 도메인 이름이란?
DNS(Domain Name System) 계층 구조를 가진 분산 데이터 베이스 서버
IP 주소와 도메인 이름 사이의 변환 Gethostbyname() : 도메인 명을 네트워크에서 통용되는 32비트 2진수로 바꾸어 준다. Gethostbyaddr() : 네트워크에서 통용되는 32비트 2진수를 도메인 명으로 바꾸어 준다. Inet_ntoa() : 32비트 2진수로 된 주소를 “.”이 있는 십진수로 변환할 때 사용 Inet_addr() : “.”이 있는 십진수를 32비트 2진수로 변환할 때 사용 202.30.54.66 www.hannam.ac.kr 01111101 01000010 01111110 00001010 gethostbyname() gethostbyaddr() inet_ntoa() inet_addr()
성공 시 hostent 구조체의 포인터, 실패시 NULL포인터 리턴 IP 주소와 도메인 이름 사이의 변환 도메인 이름을 사용해서 IP 주소 얻어내기 Getbyhostname() 인자로 호스트명을 주면 그 호스트에 대한 정보를 구할 수 있다 그 중의 하나가 32비트로 된 IP 주소임. #include <netdb.h> Struct hostent* gethostbyname(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. */ };
IP 주소와 도메인 이름 사이의 변환 도메인 이름을 사용해서 IP 주소 얻어내기 if (!host) host = gethostbyname(argv[1]); if (!host) error_handling("gethostbyname() error"); printf("Officially name : %s \n\n", host->h_name); puts("Aliases-------------------------------"); for(i=0;host->h_aliases[1];i++){ puts(host->h_aliases[i]); } printf("Address Type : %s \n", host->h_addrtype==AF_INET? "AF_INET":"AF_INET6"); puts("IP Address-----------------------"); for(i=0; host->h_addr_list[i];i++){ puts(inet_ntoa( *(struct in_addr*)host->h_addr_list[i]));
성공 시 hostent 구조체의 포인터, 실패시 NULL포인터 리턴 IP 주소와 도메인 이름 사이의 변환 IP 주소를 이용해서 도메인 이름 알아내기 #include <netdb.h> Struct hostent* gethostbyaddr(const char * addr, int len, int type); 성공 시 hostent 구조체의 포인터, 실패시 NULL포인터 리턴
IP 주소와 도메인 이름 사이의 변환 IP 주소를 이용해서 도메인 이름 알아내기 host=gethostbyaddr((char*)&addr.sin_addr, 4, AF_INET); if(!host) error_handling("gethostbyaddr() error"); printf("Officially name : %s \n\n", host->h_name); puts("Aliases------------------------"); for(i=0;host->h_aliases[i];i++){ puts(host->h_aliases[i]); } printf("Address Type : %s \n", host->h_addrtype==AF_INET ? "AF_INET":"AF_INET6"); puts("IP Address------------------"); for(i=0; host->h_addr_list[i];i++){ puts(inet_ntoa(*(struct in_addr*)host->h_addr_list[i])); return 0;
IP 주소와 도메인 이름 사이의 변환 윈도우 기반으로 구현하기 #include <winsock2.h> Struct hostent FAR *gethostbyname( const char FAR *name ); 성공 시 0, 실패시 SOCKET_ERROR 리턴 Struct hostent { char FAR * h_name; char FAR * FAR h_aliases; short h_addrtype; short h_length; char FAR * FAR h_addr_list; #include <winsock2.h> Struct hostent FAR *gethostbyaddr( const char FAR *addr, int len, int type ); 성공 시 0, 실패시 SOCKET_ERROR 리턴
참고문헌 “UNIX Network Programming”, W.Richard Stevens “TCP/IP 소켓 프로그래밍”, 윤성우 저
Q & A