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

📄 udp_ce.cpp

📁 Wince EVC 下的UDP通讯应用程序 自己写的UDP通讯类
💻 CPP
字号:
// UDP_CE.cpp: implementation of the UDP_CE class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "CEUDP.h"
#include "UDP_CE.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

UDP_CE::UDP_CE()
{

}

UDP_CE::~UDP_CE()
{

}

UINT UDP_CE::RecvThread(LPVOID lparam)
{
    CCEUDPDlg dlg;
    UDP_CE *pSocket;
	pSocket=(UDP_CE*)lparam;
	fd_set fdRead;
	int ret;
	TIMEVAL aTime;
	char * recvBuf=NULL;
	recvBuf=new char (13);
	aTime.tv_sec=1;
	aTime.tv_usec=0;
	SOCKADDR_IN tmpAddr;
	int temRecvLen;
	int recvLen;
	int iErrorCode;

	while (true)
	{
		if (WaitForSingleObject(pSocket->m_ExitThreadEvent,0)==WAIT_OBJECT_0)
		{
			break;
		}
        FD_ZERO(&fdRead);
		FD_SET(pSocket->m_UDPSocket,&fdRead);
		ret=select(0,&fdRead,NULL,NULL,&aTime);
		if (ret==SOCKET_ERROR)
		{
			iErrorCode=WSAGetLastError();
			dlg.OnUdpCEError(pSocket->m_pOwnerWnd,iErrorCode);
			break;
		}

		if (ret>0)
		{
			if (FD_ISSET(pSocket->m_UDPSocket,&fdRead))
			{
				tmpAddr.sin_family=AF_INET;
                tmpAddr.sin_port=htons(pSocket->m_RemoteAddr.sin_port);
				tmpAddr.sin_addr.s_addr=INADDR_ANY;
				temRecvLen=sizeof(tmpAddr);

				recvBuf=new char [30];
				ZeroMemory(recvBuf,30);
				recvLen=recvfrom(pSocket->m_UDPSocket,recvBuf,30,0,(SOCKADDR*)&tmpAddr,&temRecvLen);
				if (recvLen==SOCKET_ERROR)
				{
					iErrorCode=WSAGetLastError();
				    dlg.OnUdpCEError(pSocket->m_pOwnerWnd,iErrorCode);
					break;
				}
				
				else if (recvLen==0)
				{
				    iErrorCode=WSAGetLastError();
 		     		dlg.OnUdpCEError(pSocket->m_pOwnerWnd,iErrorCode);
					break;
				}
				else
				{
			
				    dlg.show(pSocket->m_pOwnerWnd,recvLen);
					//dlg.OnUdpCERecv(pSocket->m_pOwnerWnd,recvBuf,recvLen,(SOCKADDR*)&tmpAddr);
				  
				  
				   
                   delete [] recvBuf;
				   recvBuf = NULL;
				  // delete [] recvedBuf;
				 //  recvedBuf = NULL;

				}

			}
		}

	}
return 0;
}

DWORD UDP_CE::SendData(const char *buf)
{
    int nBytes=0;
 	int nSendBytes=0;
	int nSumBytes=0;
 	int nErrorCode;
 

 
 
 	nSumBytes=13;
 
 

 	while (nSendBytes<nSumBytes)
 	{
          nBytes=sendto(m_UDPSocket,buf+nSendBytes,nSumBytes-nSendBytes
 			 ,0,(sockaddr*)&m_RemoteAddr,sizeof(m_RemoteAddr));
          if (nBytes==SOCKET_ERROR)
          {
 			 nErrorCode=WSAGetLastError();
//			 m_OnUdpError(m_pOwnerWnd,nErrorCode);
 			 return -1;
          }

          if (nSendBytes==nSumBytes)
          {
 			 break;
          }
 		 Sleep(100);
 		 nSendBytes=nSendBytes+nBytes;
 
 	}

 	return nSendBytes;
}



DWORD UDP_CE::Open(CWnd *pWnd, int localport, LPCTSTR remoteHost, int remotePort)
{
    WSADATA wsa;
    m_pOwnerWnd = pWnd;
	//加载winsock动态链接库
	if (WSAStartup(MAKEWORD(1,1),&wsa)!=0)
	{
		return -1;
	}

	//创建UDP套字
	m_UDPSocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
	if (m_UDPSocket==INVALID_SOCKET)
	{
		return -2;
	}

	SOCKADDR_IN localAddr;
	localAddr.sin_family=AF_INET;
	localAddr.sin_port=htons(localport);
	localAddr.sin_addr.s_addr=INADDR_ANY;


	//绑定地址
	if (bind(m_UDPSocket,(sockaddr*)&localAddr,sizeof(localAddr))!=0)
	{
		return -3;
	}

	//设置非阻塞通讯
    DWORD ul=1;
	ioctlsocket(m_UDPSocket,FIONBIO,&ul);

	//创建一个线程退出事件
	m_ExitThreadEvent = CreateEvent(NULL,true,false,NULL);
	//创建通讯线程
	AfxBeginThread(RecvThread,this);
	m_RemoteAddr.sin_family=AF_INET;
	m_RemoteAddr.sin_port=htons(remotePort);

	//将双字节转换为单字节

	char ansiRemoteHost[255];
	ZeroMemory(ansiRemoteHost,255);
	WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,remoteHost,wcslen(remoteHost)
		,ansiRemoteHost,wcslen(remoteHost),NULL,NULL);
	m_RemoteAddr.sin_addr.s_addr=inet_addr(ansiRemoteHost);
	return 1;
}

DWORD UDP_CE::Close()
{
    SetEvent(m_ExitThreadEvent);
	Sleep(2000);
	CloseHandle(m_ExitThreadEvent);

	if (closesocket(m_UDPSocket)==SOCKET_ERROR)
	{
		return -1;
	}
    if (WSACleanup()==SOCKET_ERROR)
    {
		return -2;
    }

	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -