struct hostent에서 h_name과 h_aliases의 출력 형태에 대한 질문
안녕하세요.
------------------------------------
1) 질문 1
다름이 아니라 윈도우에서 gethostbyname과 gethostbyaddr를 이용하여 프로그램을 작성하였습니다.
그런데, 문제는 일반적인 서버의 도메인 네임과 ip 주소를 이용할 경우,
도메인 네임으로 gethostbyname을 사용할때는 h_aliases의 내용이 나오지 않는데,
ip 주소로 gethostbyaddr를 이용하면 h_aliases 내용을 출력할 수 있었습니다.
이 반대의 경우도 생깁니다.
왜 이런 현상이 일어나는지요?
------------------------------------
2) 질문 2
질문 1)에서와 같이 실행하고 나서 결과를 보면 h_name이 서로 다른 경우가 많은데,
이것은 어떻게 그러한지요?
보통 h_name은 공식적인 도메인 아닌가요?
------------------------------------
프로그램은 일반적인 VC++6을 사용하였고, 아래에 프로그램을 올립니다.
여기서 도메인 네임과 ip주소는 같은 곳이며,
프로그램에서 도메인 네임(여기서는 www.yahoo.co.kr)을 gethostbyname에 입력하고,
그 결과로 얻은 h_addr_list[0] 주소를 다시 gethostbyaddr에 입력하였습니다.
알려주시면 감사하겠습니다.
------------------------
#include <winsock2.h> #include <stdlib.h> #include <stdio.h> void ViewInfo(HOSTENT *ptr); void ViewInfo(HOSTENT *ptr) { printf(" # h_name | %s \n", ptr->h_name); int n1=0; while(ptr->h_aliases[n1] != NULL) { printf(" # h_aliases[%d] | %s \n", n1, (ptr->h_aliases[n1++]) ); } printf(" # h_addtype | %d \n", ptr->h_addrtype); printf(" # h_length | %d \n", ptr->h_length); int n2=0; while(ptr->h_addr_list[n2] != NULL) { IN_ADDR addr1; memcpy(&addr1, ptr->h_addr_list[n2], ptr->h_length); printf(" # h_addr_list[%d] | %s \n", n2++, inet_ntoa(addr1) ); } } void err_display(char *msg) { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER| FORMAT_MESSAGE_FROM_SYSTEM, NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL); printf("[%s] %s", msg, (LPCTSTR)lpMsgBuf); LocalFree(lpMsgBuf); } BOOL GetIPAddr(char *name, IN_ADDR *addr) { HOSTENT *ptr = gethostbyname(name); if(ptr == NULL){ err_display("gethostbyname()"); return FALSE; } ViewInfo(ptr); memcpy(addr, ptr->h_addr, ptr->h_length); return TRUE; } BOOL GetDomainName(IN_ADDR addr, char *name) { HOSTENT *ptr = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET); if(ptr == NULL){ err_display("gethostbyaddr()"); return FALSE; } ViewInfo(ptr); strcpy(name, ptr->h_name); return TRUE; } int main(int argc, char* argv[]) { WSADATA wsa; if(WSAStartup(MAKEWORD(2, 2), &wsa) != 0) return -1; IN_ADDR addr; if(GetIPAddr("www.yahoo.co.kr", &addr)){ printf("IP 주소 = %s\n", inet_ntoa(addr)); char name[256]; if(GetDomainName(addr, name)){ printf("도메인 이름 = %s\n", name); } } WSACleanup(); return 0; }
*****************************
다음은 결과입니다.
*****************************
# h_name | rc.fy.b.yahoo.com # h_aliases[0] | <a href="http://www.yahoo.co.kr" rel="nofollow">www.yahoo.co.kr</a> # h_aliases[1] | rc.yahoo.com # h_addtype | 2 # h_length | 4 # h_addr_list[0] | 68.180.206.184 IP 주소 = 68.180.206.184 # h_name | w2.rc.vip.sp1.yahoo.com # h_addtype | 2 # h_length | 4 # h_addr_list[0] | 68.180.206.184 도메인 이름 = w2.rc.vip.sp1.yahoo.com
댓글 달기