📄 baseudp.cpp
字号:
// BaseUDP.cpp: implementation of the CBaseUDP class.
//
//////////////////////////////////////////////////////////////////////
#include "BaseUDP.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBaseUDP::CBaseUDP()
{
WSAData wsa;
int nRet = WSAStartup(MAKEWORD(2, 2), &wsa);
m_skServer = 0;
}
CBaseUDP::~CBaseUDP()
{
if(m_skServer)
{
closesocket(m_skServer);
}
WSACleanup();
}
int CBaseUDP::Send(char *szData, int nLength, const char *szIP, unsigned short port, sockaddr_in &saServer)
{
if(nLength <= 0)
{
return ERROR_UDP_PARAM;
}
if(szData == NULL)
{
return ERROR_UDP_PARAM;
}
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = inet_addr(szIP);
saServer.sin_port = htons(port);
if(saServer.sin_addr.s_addr == INADDR_NONE)
{
return ERROR_UDP_ADDR;
}
int sk = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sk == SOCKET_ERROR)
{
return ERROR_UDP_SOCKET;
}
int nRet = sendto(sk, szData, nLength, 0, (struct sockaddr *)&saServer, sizeof(sockaddr_in));
return sk;
}
int CBaseUDP::Send(char *szData, int nLength, int sk, sockaddr_in saClient, int nSockaddrLen)
{
if(nLength <= 0)
{
return ERROR_UDP_PARAM;
}
if(szData == NULL)
{
return ERROR_UDP_PARAM;
}
if(saClient.sin_addr.s_addr == INADDR_NONE)
{
return ERROR_UDP_ADDR;
}
if (sk == SOCKET_ERROR)
{
return ERROR_UDP_SOCKET;
}
if(sendto(sk, szData, nLength, 0, (struct sockaddr *)&saClient, nSockaddrLen) != nLength)
{
}
return sk;
}
int CBaseUDP::RunAsServer(unsigned short nPort)
{
if(m_skServer)
{
closesocket(m_skServer);
m_skServer = 0;
}
m_skServer = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (m_skServer == SOCKET_ERROR)
{
return ERROR_UDP_SOCKET;
}
sockaddr_in saServer;
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = inet_addr("127.0.0.1");
saServer.sin_port = htons(nPort);
if(saServer.sin_addr.s_addr == INADDR_NONE)
{
return ERROR_UDP_ADDR;
}
if(bind(m_skServer, (struct sockaddr *)&saServer, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
{
closesocket(m_skServer);
return ERROR_UDP_BIND;
}
DWORD dwThreadID;
HANDLE hUdpThread = CreateThread(NULL, 0, DataThread, this, 0, &dwThreadID);
if (hUdpThread)
{
SetThreadPriority(hUdpThread, THREAD_PRIORITY_TIME_CRITICAL);
CloseHandle(hUdpThread);
}
return 0;
}
int CBaseUDP::WaitForDataRecv(int sk, long nTimeout)
{
fd_set RSet;
struct timeval tv;
tv.tv_sec = nTimeout;
tv.tv_usec = 0;
FD_ZERO(&RSet);
FD_SET((unsigned int)sk, &RSet);
int nSelRet = select(sk + 1,&RSet, NULL, NULL, &tv);
if(nSelRet == 0)
return ERROR_UDP_TIMEOUT;
else if(nSelRet == SOCKET_ERROR)
return ERROR_UDP_SOCKET;
return 0;
}
int CBaseUDP::OnDataRecv(char *szData, int nLength, int sk, sockaddr_in saClient, int nSaLength)
{
return 0;
}
DWORD WINAPI CBaseUDP::DataThread(LPVOID lpvoid)
{
CBaseUDP *pUdp = (CBaseUDP *)lpvoid;
char szBuf[512] = {0};
int nWaitRet;
//OnError(0x08, "[%s %d]CBaseUDP::DataThread Started.\n", GetCurFile(__FILE__), __LINE__);
while(1)
{
nWaitRet = CBaseUDP::WaitForDataRecv(pUdp->m_skServer, UDP_TIME_OUT);
if(nWaitRet == ERROR_UDP_TIMEOUT)
continue;
if(nWaitRet < 0)
{
return 0L;
}
sockaddr_in saClient;
int nSockaddrLen = sizeof(struct sockaddr);
int nRecvLength = recvfrom(pUdp->m_skServer, szBuf, 512, 0, (struct sockaddr *)&saClient, &nSockaddrLen);
pUdp->OnDataRecv(szBuf, nRecvLength, pUdp->m_skServer, saClient, nSockaddrLen);
}
return 0L;
}
int CBaseUDP::Recv(char *pcaData, const int nLength, int sk, sockaddr_in saClient, bool bClose)
{
int nSaLength = sizeof(sockaddr_in);
int nRet;
if((nRet = recvfrom(sk, pcaData, nLength, 0, (struct sockaddr *)&saClient, &nSaLength)) == SOCKET_ERROR)
{
closesocket(sk);
return ERROR_UDP_SOCKET;
}
pcaData[nRet] = 0;
if(bClose)
closesocket(sk);
return nLength;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -