도메인네임서버 (Domain Name Server)

뭐,, 서버라고도하고 시스템이라고도하는데, 뭐가 맞는건지 아니면 서로 다른 용어인지는 잘 모르겠으나

어쨋든

 

알고있겠지만, www.naver.com 이런 도메인에서 실제 아이피를 얻어내는 작업이다.

 

지금 할거는

도메인 서버를 통한 아이피 얻어내기(도메인 -> ip) 해보자



 

1. DNS

 - IP주소와 대응되는 이름으로 사람이 기억해서 사용자가 쉽게 하려고 만든거다, TCP/IP 프로토콜은 도메인 이름을 인식하지 못하므로, 사용자가 입력한 도메인을 IP주소로 바꾸어주어야 한다.

 

2. gethostbyaddr

 - 구조

   : struct HOSTENT FAR * gethostbyaddr

     {

         const char FAR * addr;

         int len;

         int type;

      };

   : addr - 네트워크 바이트 오더의 어드레스 포인터

   : len  - 어드레스의 길이를 지정한다. (32비트 IP 어드레스의 경우 항상 4)

   : type - 입력 어드레스의 형태 ( ex : PF_INET)

 - 아무 에러 없으면 HOSTENT 구조체의 포인터 리턴, 에러발생하면 NULL 리턴

 - gethostbyaddr 함수는 주어진 네트워크 어드레스와 대응된 이름과 주소를 가진 HOSTENT 구조체의 포인터를 리턴, 모든 스트링은 NULL로 끝나는 문자열의 형태

 

3. gethostbyname

 - 구조

   : struct HOSTENT FAR * gethostbyname

     {

         const char FAR * name;

     };

   : name - NULL로 끝나느 호스트 이름

 - 에러가 없으면 HOSTENT 구조체의 포인터 리턴

 - gethostbyaddr 함수와 같이 gethostbyname 함수는 리턴값으로 HOSTENT 구조체에 대한 포인터나 NULL을 반환한다. 구조체는 소켓 시스템에 할당되고 애플리케이션에서는 이 구조체를 정하거나 내용을 비워서는 안됩니다, 또한 각각의 스레드에 대하여 이 구조체의 한개의 카피본만이 할당되어야 합니데이, 유효성은 다른 윈도우 소켓함수가 호출될 때 까지만 보장되므로 애플리케이션은 이 정보가 필요하다면 다른 윈도우 소켓 함수가 호출되기 전에 특정한 정보를 카피해야 한다.

 

4. hostent

 - 구조

   : struct hostent

    {

       char FAR *               h_name;

       char FAR * FAR *      h_aliases;

       short                        h_addtype;

       short                        h_length;

       char FAR * FAR *      h_addr_list;

    }

   : h_name - 호스트의 공식적 이름, 만약 DNS나 유사한 시스템이 사용되면 이 멤버는 FQDN(Fully Qualified Domain Name)을 가지게 된다.

   : h_aliases - 호스트 이름과 관계되는 이름으로, NULL로 끝나는 스트링 배열

   : h_addtype - 어드레스 타입을 지정하는데, 윈도우 소켓의 경우 걍 PF_INET

   : h_length - 각 어드레스의 길이를 지정하며, PF_INET이면 걍 4

   : h_addr_list - NULL 문자로 끝나느 호스트의 주소 리스트입니다, 주소는 네트워크 바이트 오더로 이전 소프트웨어와의 호환성을 위해 h_addr_list[0]을 의미하는 h_addr 매크로가 정의되어 있음.....

 

이해안되면 다필요없어 걍 예제봐

 

5. 예제

#include <Winsock.h>

#include <stdio.h>

#include <stdlib.h>

 

BOOL GetIPAddr(char *name, IN_ADDR *addr)

{

   HOSTENT *ptr = gethostbyname(name);

   if(ptr == NULL)

   {

         printf("호스트 이름을 못읽어와요");

         return FALSE;

    }

    memcpy(addr, ptr->h_addr, ptr->h_length);  // IN_ADDR 형에 ptr내용 복사

}

 

BOOL GetDomainName(IN_ADDR *addr, char *name)

{

    HOSTENT *ptr = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET);

    if( ptr == NULL )

    {

         printf("호스트 이름 모르겠어잉");

         return FALSE;

    }

    strcpy(name, ptr->h_name);              // ptr에 있는 호스트 이름 문자열형으로 name변수에 복사

    return TRUE;

}

 

int main()

{

    // 윈속 초기화

    WSADATA wsa;

    if(WSAStartup(MAKEWORD(2, 2), &wsa) != 0)

        return -1;

 

    IN_ADDR addr;

 

    if( GetIPAddr("ns1.naver.com", &addr))

    {

         printf("IP 주소 = %s\n", inet_ntoa(addr));

 

         // IP주소 -> 도메인 명으로 출력

         char name[256];

         if( GetDomainName(addr, name) )

            printf("도메인 명 = %s\n", name);

    }

 

    // 윈속 종료

    WSACleanup();

    return 0;

}

'Web, Network Programming > Socket' 카테고리의 다른 글

멀티 스레드 TCP 서버/클라이언트  (0) 2014.06.16
TCP 서버/클라이언트  (0) 2014.06.16
바이트 정렬  (0) 2014.05.29
Socket 생성  (0) 2014.05.29
WS2_32.DLL  (0) 2014.05.29
Posted by 긍정왕오킹