참으로 골치아픈 문제였다. 하지만 답은 간단했다.

 문제의 시작점은 gethostbyaddr() 함수를 호출하면서 시작됐다.

 210.125.213.93 (본인 블로그의 IP)주소. 어라???안돼네??

 무슨 문제일까…..
 211.115.77.213 (daum 의 IP 주소). 이것도 안되네??

사용자 삽입 이미지

 무슨 문제가 있나보다….나는 책에 나온 예제를 다시 하나하나 비교를 하면서 혹시 있을지 모를 미스타이핑을 찾아보았다.

 그런데…없.었.다.

 도대체 무엇이 문제일까…

 한참 고민을 하다가 디버깅을 해보았다.

 역시나….gethostbyaddr()함수를 호출하는 부분에서 에러가 발생했다.
 
 이 함수의 실행결과값이 바로 NULL 값이었던 것이다.

 그렇다면 왜 NULL 을 반환할까…계속 고민해보았다.

 혹시나 내가 인자값의 자료형을 잘못 전달한건 아닐까…함수사용을 제대로 하지 못한것은 아닐까…

 몇시간을 고민한 끝에 겨우 답을 얻을 수 있었다….

 IP 주소를 도메인 이름으로 바꾸는 과정은 역방향으로 조회를 하는 것이다.

 그런데 이 역방향 도메인 주소를 조회하기 위해서는 ISP에서 따로이 등록을 해줘야 한다.

 다시 설명을 하자면….

 daum.net == 211.115.77.213 이것은 조회가 가능하지만…(네임서버를 통해서)

 211.115.77.213 == daum.net 이것은 조회가 불가능할 수도 있다는 이야기이다.

 혹시나 싶어…학교 네임서버의 IP를 넣어 보았다.

사용자 삽입 이미지

 정상적으로 작동하는 것이 보인다 : )

 아마도 나와 비슷한 경험을 하는 사람들이 많으리라 생각된다.

 하지만 자신의 프로그램이 잘못된 것은 아니니 걱정말고 자신의 DNS서버의 IP를 넣어보거나 gethostbyname 함수를 통해 알아낸 정보중에 ns.*****.*****로 시작하는 주소의 IP를 넣어보길 바란다.

 그러면 아주 잘 동작하는 자신의 프로그램을 볼 수 있을 것이다.

 다음은 본인이 사용한 프로그램의 소스이다. 참고가 되길 바란다 : )

gethostbyaddr.c (Language : c)
  1. /***************************************************************************
  2. *            gethostbyaddr.c
  3. *
  4. *  Sat Jan  5 22:18:59 2008
  5. *  Copyright  2008  pchero21
  6. *  pchero21@gmail.com
  7. ****************************************************************************/
  8.  
  9. /*
  10. *  This program is free software; you can redistribute it and/or modify
  11. *  it under the terms of the GNU General Public License as published by
  12. *  the Free Software Foundation; either version 2 of the License, or
  13. *  (at your option) any later version.
  14. *
  15. *  This program is distributed in the hope that it will be useful,
  16. *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18. *  GNU General Public License for more details.
  19. *
  20. *  You should have received a copy of the GNU General Public License
  21. *  along with this program; if not, write to the Free Software
  22. *  Foundation, Inc., 59 Temple Place – Suite 330, Boston, MA 02111-1307, USA.
  23. */
  24.  
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #include <unistd.h>
  29. #include <arpa/inet.h>
  30. #include <netdb.h>
  31.  
  32.  
  33. void error_handling(char *message);
  34.  
  35. int main(int argc, char **argv)
  36. {
  37.     struct hostent *host;
  38.     struct sockaddr_in addr;
  39.     int i;
  40.    
  41.     if(argc != 2) {
  42.         printf(“Usage : %s <IP> n, argv[0]);
  43.         exit(1);
  44.     }
  45.    
  46.     memset(&addr, 0, sizeof(addr));
  47.     addr.sin_addr.s_addr = inet_addr(argv[1]);
  48.  
  49.     host = gethostbyaddr((char*)&(addr.sin_addr.s_addr), 4, AF_INET);
  50.     if(!host)
  51.         error_handling(“gethostbyaddr() error!”);
  52.    
  53.     printf(“Officially name : %s nn, host->h_name);
  54.    
  55.     puts(“Aliases———————-“);
  56.     for(i = 0; host->h_aliases[i]; i++) {
  57.         puts(host->h_aliases[i]);
  58.     }
  59.    
  60.     printf(“Address Type : %s n, host->h_addrtype == AF_INET ? “AF_INET” : “AF_INET6”);
  61.  
  62.     puts(“IP Address——————“);
  63.     for(i = 0; host->h_addr_list[i]; i++) {
  64.         puts(inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
  65.     }
  66.     return 0;
  67. }
  68.  
  69. void error_handling(char *message)
  70. {
  71.     fputs(message, stderr);
  72.     fputc(n, stderr);
  73.     exit(1);
  74. }
  75.  

Tags: , ,

4 Comments on gethostbyaddr 함수 호출시 널(NULL)값 리턴 문제…

  1. 김형석 says:

    와 -_-ㅋ 죠낸 감사해요 -_-ㅋ

    저도 첨에.. 제가 오타낸줄 알고.. 엄청 뒤적거렸는데 ㅠㅠ

    아.. 이런 이유가 잇었군요 -_-ㅅㄱ하셧습니다. ㅎㅎ

  2. 채재영 says:

    저희 학교 도메인은 왜 안될까요..
    네이버 두곳도 다 조회가 안되네요ㅋㅋ
    하도 안되서 뒤적뒤적 하다가 여기까지 오게됐습니다
    감사합니다.

    공주대학생이시네요^^;
    게임디자인과가 있는…

    • 탱이 says:

      반갑습니다. 🙂

      말씀하신 학교 도메인의 조회가 안되는 것은 아마도 네임서버 관리자가 역방향 도메인 주소 설정을 하지 않아서 인것 같습니다.

      네임서버를 설정시, 원래 역방향 DNS 설정은 필수사항이 아닌 선택사항입니다.

      그리고 처음 네임서버를 구성할 시, 필요한 도메인(예를 들면 www 와 같은..)들에 대해서 역방향 DNS를 설정했다하더라도 후에 이 도메인의 IP 주소를 바꾸는 과정에서 역방향 DNS 주소를 설정하지 않아서 일수도 있습니다.

      정방향 DNS와 역방향 DNS의 주소 설정과 관련된 파일은 따로이 작성해서 운영하기 때문에 이런 현상이 발생할 수 있습니다.

      그래서 보통은 가장 중요한 네임서버의 IP만 역방향 조회가 가능하도록 유지를 하고 나머지는 그냥 보통은 정방향 DNS만 유지하는 것이 보통입니다. 🙂

      그리고 네이버의 경우는 아마도 그냥 naver.com 의 주소를 입력하셨는 것 같습니다.

      119.205.240.165
      175.158.30.90
      119.205.240.165

      의 IP 주소를 입력하여 다시 실행시켜 보시면 ns1.naver.com… 등과 같은 역방향 DNS 정보를 확인하실 수 있으실 겁니다. 🙂

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.