📄 udp_ce.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 + -