- 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);
댓글 없음:
댓글 쓰기