페이지

2014년 12월 25일 목요일

MFC UDP 구현 가이드라인

1. CASyncSocket을 상속받아 CListenSocket 을 생성 

- OnReceive() 를 재정의 함 (필수)

void CUdpSocket::OnReceive(int nErrorCode)
{
    BYTE* Lb_Buffer = new BYTE[mi_BufferSize];
    int Li_BufferSize = sizeof(BYTE) * mi_BufferSize;
    ::ZeroMemory(Lb_Buffer, Li_BufferSize);

    CString Ls_RemoteAddr;
    UINT Li_RemotePort;
    int Li_numRead = ReceiveFrom(Lb_Buffer, Li_BufferSize, 
                                 Ls_RemoteAddr, Li_RemotePort); 

    switch (Li_numRead)
    {
       case NULL:
           Close();
           break;

       case SOCKET_ERROR:
           {
              int Li_ErrorCode = GetLastError();
              if (Li_ErrorCode != WSAEWOULDBLOCK)
              {
                  if (Li_ErrorCode != WSAEMSGSIZE)
                  {
                      // OnReceiveError;
                  }
                  else
                  {
                      // Datagram was too large and was truncated
                      // Buffer 추가로 담으면
                  }
              }
          }
          break;

       default:
          // 받아온 Data 처리
    }
    CAsyncSocket::OnReceive(nErrorCode);
} 

 2. 자신의 Port 번호로 Socket 생성

m_UdpSocket.Create(mi_port, SOCK_DGRAM) 이거 한줄로도 Socket 생성은 끝나지만 별도 함수로 구현을 하려면 아래와 같이 하면 된다.

BOOL CUdpSocket::Create()
{
if (!CAsyncSocket::Create(mi_port, SOCK_DGRAM)) return FALSE;
if (mb_EnableBroadcast) // Broadcast 해야 경우에는 아래도 세팅
{
int rflag = 0, flag =1;
if (!SetSockOpt(SO_BROADCAST, &flag, sizeof(int))) return FALSE;
int len = sizeof(flag);
if (!GetSockOpt(SO_BROADCAST, &rflag, &len) && rflag == 0) return FALSE;
}
return TRUE;
}

3. Data 전송시는 SendTo 함수 호출


m_Udp->SendTo((LPVOID)(LPCTSTR)mstr_SendMsg, mstr_SendMsg.GetLength() * 2, 
               mi_RemotePort, (LPCTSTR)mstr_TargetAddr);




댓글 없음:

댓글 쓰기