⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 baseudp.cpp

📁 用PC机访问wince的远程桌面,还可以上传文件,杀进程等功能,服务端在wince,客服端在windows下
💻 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 + -