#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(); }