📄 udpsocket.cpp
字号:
// UdpSocket.cpp: implementation of the UdpSocket class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "UdpSocket.h"
#include "CommLink.h"
CUdpSocket::CUdpSocket()
{
m_fWantOpen = FALSE;
m_fOpened = FALSE;
m_hStopEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
}
CUdpSocket::~CUdpSocket()
{
::SetEvent(m_hStopEvent);
m_threadConnect.WaitForEnd();
::CloseHandle(m_hStopEvent);
}
void CUdpSocket::SetCommLink(CCommLink* pCommLink)
{
m_pCommLink = pCommLink;
}
void CUdpSocket::SetLocalIpAddress(CIpAddress& ipAddr)
{
m_ipAddrLocal = ipAddr;
}
void CUdpSocket::Start()
{
::ResetEvent(m_hStopEvent);
m_threadConnect.Create(StaticConnectThreadFunc, this);
m_fWantOpen = TRUE;
}
void CUdpSocket::Stop()
{
m_fWantOpen = FALSE;
Close();
SetEvent(m_hStopEvent);
m_threadConnect.WaitForEnd();
}
DWORD WINAPI CUdpSocket::StaticConnectThreadFunc(void* p)
{
return ((CUdpSocket*)p)->ConnectThreadFunc();
}
DWORD CUdpSocket::ConnectThreadFunc()
{
for (;;)
{
if (m_fWantOpen && !m_fOpened)
{
if (Create(SOCK_DGRAM, FD_READ, m_ipAddrLocal))
{
BOOL bAllowBroadcast = TRUE;
int nRet = setsockopt(m_hSocket, SOL_SOCKET, SO_BROADCAST, (char*)&bAllowBroadcast, sizeof(BOOL));
m_pCommLink->OnUdpSocketOpen();
m_fOpened = TRUE;
for (;;)
{
CIpAddress ipAddrPeer;
int nSize = sizeof(ipAddrPeer);
int nRxLen = recvfrom(m_hSocket, (char*)m_pbBuf, sizeof(m_pbBuf), 0, &ipAddrPeer, &nSize);
if (nRxLen == SOCKET_ERROR)
{
DWORD dwErr = WSAGetLastError();
if (dwErr != WSAEWOULDBLOCK)
{
Close();
break;
}
}
else
{
m_pCommLink->OnRxPackage(this, ipAddrPeer, m_pbBuf, nRxLen);
}
if (::WaitForSingleObject(m_hStopEvent, 10) == WAIT_OBJECT_0)
return 0;
}
}
}
if (::WaitForSingleObject(m_hStopEvent, 100) == WAIT_OBJECT_0)
break;
}
return 0;
}
void CUdpSocket::OnClear()
{
CSunnyAsyncSocket::OnClear();
m_pCommLink->OnUdpSocketClose();
m_fOpened = FALSE;
}
BOOL CUdpSocket::Write(CIpAddress& ipAddrPeer, BYTE* p, DWORD dwLen)
{
if (!m_fWantOpen)
return FALSE;
try
{
int nRet = sendto(m_hSocket, (char*)p, dwLen, 0, &ipAddrPeer, sizeof(CIpAddress));
return (nRet != SOCKET_ERROR);
}
catch (CException* e)
{
e->Delete();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -