본문 바로가기

Computer/ServerProgramming

자신의 IP 가져오기

서버를 하다가 보면 가끔 자기 자신의 IP가 필요할 때가 있습니다.
여러가지 방법이 있겠지만... 
주로 getsockname() 또는 gethostname()과 gethostbyname()을 사용한 2가지 방법으로 사용하더군요.
저는 이호성 님의 블로그(astromaker.egloos.com) 에서 본 글(http://astromaker.egloos.com/tb/81576) 을 참고하여 사용했습니다.
이호성 님이 말씀하셨듯이 이렇게 사용하려면 우선은 bind를 해야됩니다.
제가 적은 소스에는 바인드 부분도 포함하였습니다.( 제가 까먹을까봐... ^^;)

WSADATA wsaData;
SOCKET tempSocket;
struct sockaddr_in temp_addr;

if( ::WSAStartup( MAKEWORD( 2, 2 ), &wsaData ) != 0 )
{
        ::WSACleanup();
        goto next;
}
if( wsaData.wVersion != MAKEWORD( 2, 2 ) )
{
        ::WSACleanup();
        goto next;
}

tempSocket = socket( AF_INET, SOCK_STREAM, 0 );
if( tempSocket == INVALID_SOCKET )
{
        ::WSACleanup();
        goto next;
}

::ZeroMemory( &temp_addr, sizeof( temp_addr ) );
temp_addr.sin_family  = AF_INET;
temp_addr.sin_addr.s_addr = ::htonl( INADDR_ANY );
temp_addr.sin_port   = ::htons( m_iPort );
 
if( ::bind( tempSocket, ( struct sockaddr * )&temp_addr, sizeof( temp_addr ) ) == SOCKET_ERROR )
{
        ::WSACleanup();
        goto next;
}
// 이상 바인드 부분이였습니다. 이 이하부터 IP를 가져오는 부분입니다.
// 방법 1. gethostname()과 gethostbyname() 을 사용한 방법 입니다.
char szHostName[255] = {0,}; 
char szLocalIP[21] = {0,};
PHOSTENT pHostInfo = NULL;

if( ::gethostname( szHostName, sizeof( szHostName ) ) == 0 )
{
        if( ( pHostInfo = ::gethostbyname( szHostName ) ) != NULL )
        {
                ::strcpy( szLocalIP, ::inet_ntoa( *(struct in_addr *)*pHostInfo->h_addr_list ) ); 
        }
}
// 방법2. getsockname() 를 사용
//아래 방법은 저는 안되더군요.
char tempIP[100];

SOCKADDR_IN sockAddr;
  ::memset( &sockAddr, 0, sizeof( sockAddr ) );

  int nSockAddrLen = sizeof( sockAddr );

  if( ::getsockname( tempSocket, (sockaddr *)&sockAddr, &nSockAddrLen ) != SOCKET_ERROR )
  {
   ::strcpy( tempIP, ::inet_ntoa( sockAddr.sin_addr ) );
   return true;
  }

'Computer > ServerProgramming' 카테고리의 다른 글

소켓의 종료  (0) 2010.02.22
소켓 생성  (0) 2010.02.22
소켓(Socket) 이란?  (0) 2010.02.22
UDP (미완성:그림 추가할거에요.)  (0) 2010.02.22
TCP (미완성:그림 추가할게요.)  (0) 2010.02.22