[질문] gethostbyaddr함수 동작 시 문제점 ...

cjynim의 이미지

소켓 프로그래밍을 공부하던 중 도메인 네임을 이용하여 IP주소를 알아내는 gethostbyname이란 함수를

알게 되어 그 함수를 이용해서 도메인 네임을 입력하면 IP주소를 화면에 출력하게 했습니다 .. (예제에

있는 소스를 그대로 타이핑 해서 실행 했습니다 ㅡㅡ;;) 그리고 반대로 IP주소를 이용해서 도메인 네임을

알아내는 함수 gethostbyaddr이 있어서 이 또한 실행해 보았습니다... 실행 시 바로 이전에 만든 예제에

서 출력 된 IP주소를 메모해 두었다가 이번 예제에서 입력해서 도메인 네임을 잘 찾아내나 알아봤습니다.

그런데 이상한건 어떤 IP주소는 도메인 네임을 잘 출력해 주는데 어떤 IP주소는 "gethost ... error"라

는 메시지를 내면서 출력을 해 주지 못합니다 ... gethostbyname()함수를 이용한 예제에서는 아무 이상

없이 도메인 네임을 잘 출력해 주는데 왜 gethostbyaddr()함수를 이용한 예제에서는 어떤 IP는 출력

해주고 어떤 IP는 출력하지 않는걸까요 ??

아래는 제가 공부한 예제 소스입니다 ...

//
//	IP주소를 이용하여 도메인 네임 알아내기
//
#pragma comment(lib, "WS2_32.LIB")
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
 
#define BUF	100
//
//	예외 처리 
//
void Error(char* msg);
//
//	Main 함수
//
int main(void) {
	//
	//	변수
	//
	WSADATA		wsaData;		// 윈속 라이브러리
 
	int i;
	char ip[BUF];
	HOSTENT* host;				// 호스트에 대한 정보
	SOCKADDR_IN	addr;			
	//
	//	Load Winsock 2.2 DLL
	//
	if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
		Error("WSAStartup() error!");
	//
	//	도메인을 입력 받는다.
	//
	printf("Input IP Address : ");
	gets_s(ip, BUF);
	//
	//	입력 받은 IP주소를 IN_ADDR형으로 변환
	//
	memset(&addr, 0, sizeof(addr));
	addr.sin_addr.s_addr = inet_addr(ip);
	//
	//	입력받은 IP주소를 이용하여 도메인 네임 알아내기
	//
	host = gethostbyaddr((char*)&addr.sin_addr, 4, AF_INET);
	if(!host)
		Error("gethost ... 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(*(IN_ADDR*)host->h_addr_list[i]));
 
	WSACleanup();
 
	return 0;
}
 
void Error(char* msg) {
	fprintf(stderr, "%s\n", msg);
	exit(1);
}

Necromancer의 이미지

모든 IP에 대해 도메인 네임이 부여된 건 아니죠.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

cjynim의 이미지

그러니까 ... 위 아이피 모두 도메인 네임을 이용해서 알아낸 아이피를 다시 아이피를 통해서 도메인

네임을 출력하게 만든 예제 거든요 ... 이 예제 이전에 도메인 네임을 이용해서 아이피를 찾아 놓고

이를 메모 해둔 뒤에 이번 예제에서 적용해본거든요 그럼 당연히 도메인 네임이 나와야 정상 아닌가요 ??

mog422의 이미지

ISP쪽에서 역방향 도메인을 등록해줘야 나와요..