현생/TCP 소켓 프로그래밍

8-2. 도메인 이름과 IP 간의 변환 [TCP/IP][C][LINUX]

푸더기 2022. 1. 23. 15:33
반응형

 

#include<netdb.h>
struct hostent* gethostbyname(const char* hostname);
// success: hostent 구조체 변수의 주소값   fail: NULL 포인터

위 함수를 이용하면 문자열 형태의 도메인 이름으로 IP 주소 정보를 얻을 수 있습니다. 위 함수의 반환 자료형인 hostent 구조체의 정의는 다음과 같습니다.

struct hostent{
	char * h_name
    char ** h_aliases;
    int h_addrtype;
    int h_length;
    char ** h_addr_list;
}

IP주소 말고도 여러 정보들을 반환해주는 것을 볼 수 있습니다.

h_name은 공식 도메인 이름이 문자열로 저장됩니다. 해당 홈페이지를 대표하는 도메인 이름이라는 의미지만 우리에게 잘 알려지지 않은 도메인 이름이 등록되는 경우도 많습니다.

h_aliases는 하나의 IP에 둘 이상의 도메인 이름을 지정할 수 있는데, 그 이름들을 문자열의 배열로 저장됩니다.

h_addrtype은 IPv4인지 IPv6인지, 주소체계에 대한 정보를 반환해줍니다. IPv4의 경우에는 AF_INET이 저장됩니다.

h_length는 IP주소의 크기 정보가 바이트단위로 담깁니다. IPv4의 경우 4, IPv6의 경우 16입니다.

h_addr_list는 도메인의 이름에 대한 IP주소들(도메인에 여러 IP를 둘 수도 있습니다)이 정수로 저장됩니다. 정수로 저장된다 했는데 자료형이 char형 이중 포인터인 이유는 IP가 4바이트 일 수도 있고 16바이트일 수도 있기 때문에 char형 포인터에 데이터를 나타내고 이를 char형 포인터 배열로 쌓은 것이고, 각 char형 포인터는 in_addr 구조체 변수의 주소값입니다.

h_aliaeses와 h_addr_list의 마지막에는 NULL이 담겨있습니다.

 

위 함수를 이용한 예제는 다음과 같습니다.

https://github.com/kjmin622/TCP-IP-Socket-Programing/blob/master/src/gethostbyname.c

 

GitHub - kjmin622/TCP-IP-Socket-Programing: 윤성우 저자님의 소켓프로그래밍 책을 기반으로 공부한 내용을

윤성우 저자님의 소켓프로그래밍 책을 기반으로 공부한 내용을 담은 저장소입니다. (Ubuntu 환경) - GitHub - kjmin622/TCP-IP-Socket-Programing: 윤성우 저자님의 소켓프로그래밍 책을 기반으로 공부한 내용

github.com

 

 

다음은 IP주소로 도메인 정보를 얻어오는 함수입니다.

#include<netdb.h>
struct hostent* gethostbyaddr(const char* addr, socklen_t len, int family);
//success: hostent 구조체 변수의 주소값   fail: NULL

addr에는 IP주소가 문자열로 들어가고 len은 IP주소의 바이트크기(IPv4의 경우 4), family는 주소체계에 대한 정보(IPv4의 경우 AF_INET)이 들어갑니다.

 

위 함수를 이용한 예제는 다음과 같습니다.

https://github.com/kjmin622/TCP-IP-Socket-Programing/blob/master/src/gethostbyaddr.c

 

GitHub - kjmin622/TCP-IP-Socket-Programing: 윤성우 저자님의 소켓프로그래밍 책을 기반으로 공부한 내용을

윤성우 저자님의 소켓프로그래밍 책을 기반으로 공부한 내용을 담은 저장소입니다. (Ubuntu 환경) - GitHub - kjmin622/TCP-IP-Socket-Programing: 윤성우 저자님의 소켓프로그래밍 책을 기반으로 공부한 내용

github.com

 

반응형