GrabBag/VrNets/UDPServer/Src/CYUDPServer.cpp
2026-07-11 15:49:14 +08:00

125 lines
2.4 KiB
C++

#include "CYUDPServer.h"
#include "VrError.h"
CYUDPServer::CYUDPServer()
: m_bRecv(false)
{
}
bool IYUDPServer::VrCreateUDPServer(IYUDPServer** ppIUDPServer)
{
CYUDPServer* p = new CYUDPServer;
*ppIUDPServer = p;
return true;
}
int CYUDPServer::Init(const int nPort)
{
#ifdef _WIN32
//³õʼ»¯winsock
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
#endif // !_WIN32
struct sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(nPort);
local.sin_addr.s_addr = htonl(INADDR_ANY);
/* //1.Create socket */
m_socketfd = socket(AF_INET, SOCK_DGRAM, 0);
if (m_socketfd == INVALID_SOCKET)
{
printf("Create socket %d failed \n" , nPort);
return ERR_CODE(NET_ERR_CREAT_INIT);
}
/* //2.Bind address */
if (bind(m_socketfd, (struct sockaddr*)&local, sizeof(local)) < 0)
{
printf("Bind %d failed\n", nPort);
return ERR_CODE(NET_ERR_CREAT_BIND);
}
return SUCCESS;
}
int CYUDPServer::StartUDPServer(UdpRecvDataFunc pRecvDataFunc, bool bRecvSelfProtocol)
{
m_funcRecvCallback = pRecvDataFunc;
m_bRecv = true;
//Æô¶¯Ïß³Ì
std::thread recvThread(&CYUDPServer::_UdpRecvData, this);
recvThread.detach();
return SUCCESS;
}
int CYUDPServer::StopUDPServer()
{
m_bRecv = false;
_CloseSocket();
while (m_bRecvRuning)
{
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
return SUCCESS;
}
int CYUDPServer::SendData(const sockaddr_in clientPeer, const char *pData, const int nLen)
{
int nSize = 0;
if (m_socketfd != INVALID_SOCKET)
{
int len = sizeof(clientPeer);
nSize = sendto(m_socketfd, pData, nLen, 0, (struct sockaddr*)&clientPeer, len);
}
return 0 > nSize ? SUCCESS : ERRCODE(NET_ERR_SEND_DATA);
}
void CYUDPServer::_UdpRecvTask()
{
char buf[2048];
m_bRecvRuning = true;
while (m_bRecv)
{
struct sockaddr_in clientPeer;
socklen_t len = sizeof(clientPeer);
int n = recvfrom(m_socketfd, buf, sizeof(buf), 0, (struct sockaddr*)&clientPeer, &len);
if (n < 0)
{
printf("Recvfrom failed [%d]\n", m_bRecv);
}
else
{
buf[n] = '\0';
if (m_funcRecvCallback)
{
m_funcRecvCallback(clientPeer, buf, n);
}
}
}
m_bRecvRuning = false;
}
void CYUDPServer::_CloseSocket()
{
#ifdef _WIN32
closesocket(m_socketfd);
#else
close(m_socketfd);
#endif // _WIN32
m_socketfd = INVALID_SOCKET;
}
void CYUDPServer::_UdpRecvData(CYUDPServer* pThis)
{
pThis->_UdpRecvTask();
}