📄 zudpsocket.cpp
字号:
///////////////////////////////////////////////////////////////////
// ZSocket.h: interface for the CZSocket class.
//
// 创建时间:6.8
// 功能:封装UDP Socket 通信接口
///////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ZUDPSocket.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
DWORD WINAPI UDPRecvThread(LPVOID lpParam);
CZUDPSocket::CZUDPSocket()
{
m_bUDPThreadEnd=TRUE;
m_bInit=FALSE;
m_hSocket=-1;
m_nPort=0;
}
CZUDPSocket::~CZUDPSocket()
{
CloseSocket();
}
BOOL CZUDPSocket::CloseSocket()
{
EndRecvThread();
closesocket(m_hSocket);
return TRUE;
}
//初始化客户端的SOCKET
BOOL CZUDPSocket::InitUDPSocket(int nPort,BOOL bIRecv)
{
if(m_bInit)
{
return FALSE;
}
sockaddr_in SockAddr;
m_hSocket = socket(AF_INET, SOCK_DGRAM,0);
if (m_hSocket == INVALID_SOCKET)
{
return FALSE;
}
char hostName[128];
ZeroMemory(hostName,sizeof(hostName));
if(gethostname(hostName,sizeof(hostName))!=0)
return FALSE;
hostent* he=gethostbyname(hostName);
u_long addr= (*(u_long FAR *) he->h_addr_list[0]);
SockAddr.sin_addr.s_addr = addr;//inet_addr(pServerIp);
SockAddr.sin_family=AF_INET;
SockAddr.sin_port=htons(nPort);
/* if(SOCKET_ERROR==bind(m_hSocket, (sockaddr FAR *)&SockAddr,sizeof(SockAddr)))
return FALSE;
m_bUDPThreadEnd=FALSE;
//if(!bIRecv)
//CreateRecvThread(this); */
char* pServerIp=inet_ntoa(SockAddr.sin_addr);
strcpy(m_ServerIp,pServerIp);
m_nPort=nPort;
m_bInit=TRUE;
return TRUE;
}
//发送消息函数
BOOL CZUDPSocket::SendTo(char Buff[],int BufLen,char* RemoteIp,int nPort)
{
if(!m_bInit)
return FALSE;
if(m_hSocket == INVALID_SOCKET) return FALSE;
sockaddr_in SockAddr;
memset(&SockAddr,0,sizeof(SockAddr));
SockAddr.sin_addr.s_addr = inet_addr(RemoteIp);
SockAddr.sin_family=AF_INET;
SockAddr.sin_port=htons((u_short)nPort);
int ret,nLeft,idx;
nLeft = BufLen;
idx = 0;
while(nLeft > 0)
{
ret = sendto(m_hSocket,&Buff[idx],nLeft,0,(sockaddr*)&SockAddr,sizeof(SockAddr));
if (ret == 0)
{
return FALSE;
}else if(ret== SOCKET_ERROR)
{
return FALSE;
}
nLeft -= ret;
idx += ret;
}
return TRUE;
}
//接收消息函数
int CZUDPSocket::ReceiveFrom(char Buff[],int BufLen,char* SourceIp,int* nPort)
{
sockaddr_in addr;
int structlen=sizeof(sockaddr_in);
int returnvalue=recvfrom(m_hSocket,Buff,BufLen,0,(sockaddr*)&addr,&structlen);
strcpy(SourceIp,inet_ntoa(addr.sin_addr));
*nPort=ntohs(addr.sin_port);
return returnvalue;
}
//接收消息函数
BOOL CZUDPSocket::ReceiveMsg(char Buff[],int BufLen,char* SourceIp,int nPort)
{
return TRUE;
}
//创建接收线程函数
void CZUDPSocket::CreateRecvThread(CZUDPSocket* pZSocket)
{
if(pZSocket==NULL) return;
if(pZSocket->m_hSocket==INVALID_SOCKET) return;
m_bUDPThreadEnd=FALSE;
DWORD dwThreadId;
HANDLE hThread = CreateThread(NULL, 0, UDPRecvThread,
pZSocket, 0, &dwThreadId);
if(hThread==NULL)
MessageBox(NULL,"创建接收线程失败!","错误提示",0);
return ;
}
//结束接收线程函数
void CZUDPSocket::EndRecvThread()
{
m_bUDPThreadEnd=TRUE;
}
DWORD WINAPI UDPRecvThread(LPVOID lpParam)
{
CZUDPSocket* pSocket=(CZUDPSocket*)lpParam;
if(pSocket==NULL) return 0;
if(pSocket->m_hSocket==INVALID_SOCKET) return 0;
char buff[5120];
int ret,structlen;
int codeID=0;
int MsgBodyLength=0;
sockaddr_in addr;
char* SourceIp;
while(!pSocket->m_bUDPThreadEnd)
{
ZeroMemory(buff,5120);
ZeroMemory(&addr,sizeof(sockaddr_in));
structlen=sizeof(sockaddr_in);
ret=recvfrom(pSocket->m_hSocket,buff,5120,0,(sockaddr *)&addr,&structlen);
SourceIp=inet_ntoa(addr.sin_addr);
if ((ret == SOCKET_ERROR)||(ret<=0))
{
return SOCKET_ERROR;
}
pSocket->ReceiveMsg(buff,ret,SourceIp,ntohs(addr.sin_port));
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -