125 lines
2.4 KiB
C++
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();
|
|
}
|
|
|