서버를 하다가 보면 가끔 자기 자신의 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 |