웹, HTML

자신의 ip 알아내기 참조

디버그정 2009. 10. 4. 00:43

/*
프로그램명 : 에코 서버(Echo Server)
프로그래머 : 김은철
저  작  권 : 이 프로그램은 개인의 학습 목적으로만 사용할 수 있으며,
             상업적 목적으로 사용할 수 없습니다.
홈페이지   : http://cafe.naver.com/pplus
이  메  일 : polarisgsi@freechal.com, eunchol71@naver.com
*/

#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>

// ws2_32.lib를 링크 시 사용
#pragma comment( lib, "ws2_32.lib" )

void ErrorDisplay( char *szError );

void main( void )
{
 int ret;

    //
    //.// 소켓 초기화
    //

 /*
 함수 : int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );
 기능 : WS2_32.DLL의 사용을 초기화한다.
 인수 : 버전, WSADATA 구조체의 번지
 설명 : 요즘은 보통 Winsock 2.2를 사용하는데,
        이렇게 설정하기 위해서 MAKEWORD(2,2)를 사용한다.
    반환 : 성공 시 0, 실패 시 에러 코드
    주의 : 이 함수는 특별한 경우가 아니면, 한 프로그램에 한 번만 호출하면 된다.
    */
    WSADATA wsa;
    ret = WSAStartup( MAKEWORD(2,2), &wsa );
    if( ret != 0 )
    {
        ErrorDisplay( "WSAStartup" );
    }


 /*
 함수 : int gethostname( char FAR * name, int namelen );
 기능 : 내 컴퓨터가 네트워크 상에 존재하는 호스트 이름을 구한다.
 인수 : 1. 호스트 이름을 받을 버퍼
           2. 호스트 이름을 받을 버퍼의 크기
 설명 : 현재 컴퓨터의 표준 호스트 명(컴퓨터 이름)을 구한다.
    반환 : 성공 시 0, 실패 시 SOCKET_ERROR
    */

   char szHostName[100];
 HOSTENT* pHostEnt;

 if( gethostname( szHostName, sizeof(szHostName)) == 0 )
 {
  printf( "내 컴퓨터 이름 : %s \n", szHostName );

      /*
     함수 : struct hostent FAR * gethostbyname( const char FAR * name );
     기능 : 호스트 이름에 해당하는 호스트 정보를 구한다.
     인수 : 1. 호스트 이름
     설명 : 호스트 IP를 구할 때 사용한다.
 
               struct hostent {
                   char FAR *       h_name;         // 호스트 명
                   char FAR * FAR * h_aliases;      // 호스트의 별명(다른 이름)
                   short            h_addrtype;     // 주소 체계
                   short            h_length;       // IP 길이
                   char FAR * FAR * h_addr_list;    // IP
               };

               typedef struct hostent HOSTENT;

               여기서 h_addr_list는 호스트 이름이 갖고 있는 IP를 담고 있다.
               호스트 IP는 4바이트로 관리되기 때문에, 이를 IN_ADDR 구조체로
               복사(memcpy)한 다음, inet_ntoa() 함수를 사용해서 "x.x.x.x"와 같은 형태의
               인터넷 IP 문자열로 변환해야 한다. 그리고 경우에 따라서는 호스트 이름에
               연관된 여러 개의 IP가 존재할 수 있는데, 이럴 때는
               h_addr_list[0], h_addr_list[1], ..., h_addr_list[n] 까지 모두 검색하여
               사용할 수 있다. 만약 더 이상 없을 경우는 h_addr_list[n]의 값은 0이 된다.
               h_addr은 h_addr_list[0]을 대신해서 사용할 수 있다.
        반환 : 성공 시 0, 실패 시 SOCKET_ERROR
        */
        if( (pHostEnt = gethostbyname(szHostName)) )
  {
   IN_ADDR in;

   memcpy( &in, pHostEnt->h_addr_list[0], 4 );
   printf( "내 컴퓨터 IP : %s \n", inet_ntoa(in) );
  }
 }

    //
    //.// 다음 사이트에 대한 모든 IP를 구하는 프로그램
    //

    printf( "www.daum.net IP 검색 \n" );

 pHostEnt = gethostbyname( "www.daum.net" );

    if( !pHostEnt )
    {
        ErrorDisplay( "gethostbyname()" );
    }
   
 IN_ADDR addr;
 
 int i = 0;
 while( pHostEnt->h_addr_list[i] )
 {
  memcpy( &addr, pHostEnt->h_addr_list[i++], pHostEnt->h_length );
  printf( "[%s] \n", inet_ntoa(addr) );
 }   

     /*
    함수 : int  WSACleanup( void );
    기능 : WS2_32.DLL의 사용을 종료한다.
    인수 : 1. 닫을 소켓 디스크립터(s 또는 cs)
    설명 : WS2_32.DLL의 사용을 종료한다.
    반환 : 성공 시 0, 실패 시 SOCKET_ERROR.
    주의 : 프로그램이 닫혀지기 전에 한 번만 호출하면 된다.
           만약 프로그램이 실행 중에 이 함수를 호출한다면 모든 소켓은 종료된다.
    */
 WSACleanup();
}

/*
함수 : void ErrorDisplay( char *szError )
기능 : 메시지 박스에 에러를 표시하고, 프로그램을 종료(exit)한다.
인수 : WSAGetLastError()-가장 최근에 발생한 소켓 에러의 번호를 리턴함
설명 : FormatMessage 함수는 내부적으로 버퍼를 할당하고, 가장 최근에 발생한
       에러에 대한 메시지를 생성한다. 생성된 메시지의 버퍼는 포인터 변수인
    lpBuff가 받아 온다.
주의 : FormatMessage 함수는 내부적으로 메모리를 할당하기 때문에 LocalFree
       함수를 호출하여 메모리를 해제하여야 한다.
*/
void ErrorDisplay( char *szError )
{
 LPVOID lpBuff;
 
 FormatMessage(  FORMAT_MESSAGE_ALLOCATE_BUFFER |
     FORMAT_MESSAGE_FROM_SYSTEM,
     NULL,
     WSAGetLastError(),
     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
     (LPTSTR)&lpBuff,
     0,
     NULL );
 
 MessageBox( NULL, (LPCTSTR)lpBuff, szError, MB_ICONSTOP );
 
 LocalFree( lpBuff );
 
 exit( 0 );  // 프로그램을 종료
}