본문으로 바로가기

MFC IP얻기

category 개발언어/c++ 2016. 10. 3. 15:55

MFC에서 IP 주소 구하기(얻기,찾기)

내부 IP

//StdAfx.h에 선언
#include "winsock2.h" 
#pragma comment(lib, "WS2_32.lib")
#define DESIRED_WINSOCK_VERSION        0x0101
#define MINIMUM_WINSOCK_VERSION        0x0001
//선언 끝
//함수구현
CString GetInIpAddress() 
{ 
WSADATA wsadata; 
CString strIP; // 이 변수에 IP주소가 저장된다. 
strIP = ""; 

if( !WSAStartup( DESIRED_WINSOCK_VERSION, &wsadata ) ) 
{ 
  if( wsadata.wVersion >= MINIMUM_WINSOCK_VERSION ) 
  { 
    HOSTENT *p_host_info; 
    IN_ADDR in; 
    char host_name[128]={0, }; 
    gethostname(host_name, 128); 
    p_host_info = gethostbyname( host_name );
 
   if( p_host_info != NULL ) 
   { 
     for( int i = 0; p_host_info->h_addr_list[i]; i++ ) 
    { 
      memcpy( &in, p_host_info->h_addr_list[i], 4 ); 
      strIP = inet_ntoa( in ); 
    } 
   } 
  }
  WSACleanup(); 
  } 
  return strIP; 
} 


외부 IP

#include 
  
//함수구현   
CString GetIpAddress()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    char name[255];
    PHOSTENT hostinfo;
    CString strIpAddress = _T("");
    wVersionRequested = MAKEWORD(2, 0);
 
    if(WSAStartup(wVersionRequested, &wsaData) == 0)
    {
        if(gethostname(name, sizeof(name)) == 0)
        {
            if((hostinfo = gethostbyname(name)) != NULL)
                strIpAddress = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
        } 
        WSACleanup();
    }
    return strIpAddress;
}


클라이언트 IP얻기

sockaddr 구조체

struct sockaddr{ 
    sa_family_t sa_family;  //  PF_INET= IPv4 주소체계.
    char sa_data[14];       // 사용하는 주소 정보. 
} 


 

sockaddr_in 구조체

IPv4 체계구조체다.
범용 주소 구조체로 sockaddr을 사용하지만, 주소체계에 따라 별도의 전용 구조체 사용 권장.
라이브러리에 넘길 때는 sockaddr로 형 변환을 하여 넘긴다.다른 주소체계 중 Local Unix 주소 체계는 sockaddr_un 구조체를 사용.

struct sockaddr_in{ 
    sin_family_t sin_family;    // IPv4 주소체계 AF_INET으로 설정 
    unist16_t sin_port;         // 포트  
    struct in_addr sin_addr;    // IP주소 정수 타입 구조체 
    char sin_zero[8];           // sockaddr 크기 맞추기 위한 버퍼. 
}
SOCKET s;  
SOCKET client_s;  
char lpszMsg[100];  
SOCKADDR_IN m_addr;  
SOCKADDR_IN m_clientAddr;  
client_s = accept(s, (LPSOCKADDR)&m_clientAddr, &m_nClientAddrLen); 
if (client_s == INVALID_SOCKET) { 
        wsprintf(lpszMsg, "accept() 에러 번호: %d", WSAGetLastError()); 
        MessageBox(hwnd, lpszMsg, "에러", MB_OK); 
} else { 
        wsprintf(lpszMsg, "client IP: %s",inet_ntoa(m_clientAddr.sin_addr.s_addr)); MessageBox        (hwnd, lpszMsg, "에러", MB_OK); 

}