📄 zsocket.cpp
字号:
///////////////////////////////////////////////////////////////////
// ZSocket.h: interface for the CZSocket class.
// 创建人:钟广荣
// 创建时间:10.28
// 功能:封装SOCKET 通信接口的实现函数
///////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ZSocket.h"
#include "ComManager.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define MSG_HEAD_LENGTH 4
//线程:接收信息Socket内容
DWORD WINAPI recvMsgThread(LPVOID lpParam);
//重新连接线程
DWORD WINAPI ReConnThread(LPVOID lpParam);
extern CComManager gMsgManager;
CZSocket::CZSocket()
{
m_hSocket=-1;
ZeroMemory(m_Ip,40);
m_nPort=0;
m_bThreadEnd=FALSE;
m_ReConnectHandle=NULL;
m_bReconnActive=FALSE;
m_bInit=FALSE;
m_bUseNetByte=FALSE;
m_RecvHandle=NULL;
ReConnectHandle=NULL;
}
CZSocket::CZSocket(BOOL bUseNetByte)
{
m_hSocket=-1;
ZeroMemory(m_Ip,40);
m_nPort=0;
m_bThreadEnd=FALSE;
m_ReConnectHandle=NULL;
m_bReconnActive=FALSE;
m_bInit=FALSE;
m_bUseNetByte=bUseNetByte;
m_RecvHandle=NULL;
ReConnectHandle=NULL;
}
CZSocket::~CZSocket()
{
if(!m_bThreadEnd)
CloseSocket();
}
BOOL CZSocket::CloseSocket(BOOL bNotClose)
{
if(m_hSocket==-1) return FALSE;
m_bThreadEnd=TRUE;
shutdown(m_hSocket,SD_BOTH);
EndRecvThread();
closesocket(m_hSocket);
m_hSocket=-1;
Sleep(20);
if(ReConnectHandle)
TerminateThread(ReConnectHandle,0);
if(m_ReConnectHandle)
CloseHandle(m_ReConnectHandle);
if(ReConnectHandle)
CloseHandle(ReConnectHandle);
if(m_RecvHandle)
CloseHandle(m_RecvHandle);
m_ReConnectHandle=NULL;
ReConnectHandle=NULL;
m_RecvHandle=NULL;
return TRUE;
}
BOOL CZSocket::InitClientSocket(char* pServerIp,int nPort)
{
if(m_bInit)
return FALSE;
ASSERT((pServerIp)&&(nPort!=0));
sockaddr_in SockAddr;
m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_hSocket == INVALID_SOCKET)
{
return FALSE;
}
if(pServerIp!=NULL)
strcpy(m_Ip,pServerIp);
m_nPort=nPort;
SockAddr.sin_addr.s_addr = inet_addr(pServerIp);
SockAddr.sin_family=AF_INET;
SockAddr.sin_port=htons(nPort);
if(connect(m_hSocket,(sockaddr*)&SockAddr,sizeof(SockAddr))==SOCKET_ERROR)
{
DWORD dwThreadId;
if(m_ReConnectHandle==NULL)
m_ReConnectHandle=CreateEvent(NULL,true,false,NULL);
if(m_ReConnectHandle==NULL)
gMsgManager.ShowInfo ("创建事件对象失败!错误提示!\r\n");
SetEvent(m_ReConnectHandle);
ReConnectHandle = CreateThread(NULL, 0, ReConnThread,
this, 0, &dwThreadId);
if(ReConnectHandle==NULL)
gMsgManager.ShowInfo("创建自动重连线程失败!错误提示!\r\n");
return FALSE;
}
CreateRecvThread(this);
OnConnected();
m_bInit=TRUE;
return TRUE;
}
void CZSocket::OnReConnected()
{
}
void CZSocket::Reconnect()
{
sockaddr_in SockAddr;
if (m_hSocket != -1)
{
shutdown(m_hSocket,SD_BOTH);
closesocket(m_hSocket);
}
m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_hSocket == INVALID_SOCKET)
{
return ;
}
SockAddr.sin_addr.s_addr = inet_addr(m_Ip);
SockAddr.sin_family=AF_INET;
SockAddr.sin_port=htons(m_nPort);
m_bInit=FALSE;
if(connect(m_hSocket,(sockaddr*)&SockAddr,sizeof(SockAddr))==SOCKET_ERROR)
{
return ;
}
CreateRecvThread(this);
m_bInit=TRUE;
OnReConnected();
OnConnected();
}
BOOL CZSocket::SendMsg(char Buff[],int BufLen)
{
if(m_hSocket == INVALID_SOCKET) return FALSE;
if(BufLen>1024) return FALSE;
m_CriSection.Lock();
int ret,nLeft,idx;
nLeft = BufLen;
idx = 0;
while(nLeft > 0)
{
ret = send(m_hSocket, &Buff[idx], nLeft, 0);
if (ret == 0)
{
m_CriSection.Unlock();
return FALSE;
}else if(ret== SOCKET_ERROR)
{
m_CriSection.Unlock();
return FALSE;
}
nLeft -= ret;
idx += ret;
}
m_CriSection.Unlock();
return TRUE;
}
BOOL CZSocket::ReceiveMsg(char Buff[],UINT BufLen)
{
ASSERT(FALSE);
return TRUE;
}
void CZSocket::CreateRecvThread(CZSocket* pZSocket)
{
ASSERT(pZSocket!=NULL);
ASSERT(pZSocket->m_hSocket!=INVALID_SOCKET);
m_bThreadEnd=FALSE;
if(m_ReConnectHandle==NULL)
m_ReConnectHandle=CreateEvent(NULL,true,false,NULL);
if(m_ReConnectHandle==NULL)
gMsgManager.ShowInfo("创建事件对象失败,错误提示!\r\n");
//停止重连的执行
ResetEvent(m_ReConnectHandle);
DWORD dwThreadId;
m_RecvHandle = CreateThread(NULL, 0, recvMsgThread,
pZSocket, 0, &dwThreadId);
if(m_RecvHandle==NULL)
gMsgManager.ShowInfo("创建接收线程失败,错误提示!\r\n");
if((!m_bReconnActive)&&(ReConnectHandle==NULL))
{
ReConnectHandle = CreateThread(NULL, 0, ReConnThread,
pZSocket, 0, &dwThreadId);
if(ReConnectHandle==NULL)
gMsgManager.ShowInfo("创建自动重连线程失败,错误提示!\r\n");
}
m_bInit=TRUE;
return ;
}
void CZSocket::EndRecvThread()
{
m_bThreadEnd=TRUE;
return ;
}
BOOL CZSocket::OnDisconnect()
{
return TRUE;
}
void CZSocket::OnConnected()
{
}
DWORD WINAPI recvMsgThread(LPVOID lpParam)
{
CZSocket* pSocket=(CZSocket*)lpParam;
ASSERT(pSocket!=NULL);
char szBuf[1024];
int nret;
int nleft=0;
int index;
UINT nMsgBodyLength=0;
while(!pSocket->m_bThreadEnd)
{
ZeroMemory(szBuf,1024);
nret = recv(pSocket->m_hSocket, szBuf, MSG_HEAD_LENGTH, 0);
if ((nret == SOCKET_ERROR)||(nret<=0)||(nret!=MSG_HEAD_LENGTH))
{
if(pSocket->m_bThreadEnd)
return 0;
SetEvent(pSocket->m_ReConnectHandle);
if(pSocket!=NULL)
pSocket->OnDisconnect();
return SOCKET_ERROR;
}
if(!pSocket->m_bUseNetByte)
nMsgBodyLength=*(DWORD*)szBuf-MSG_HEAD_LENGTH;
else
nMsgBodyLength=ntohl(*(DWORD*)szBuf)-MSG_HEAD_LENGTH;
nleft=nMsgBodyLength;
if(nleft>1024)
{
TRACE("MESSAGE LENGTH ERROR\n");
if(pSocket!=NULL)
pSocket->OnDisconnect();
return 1;
}
index=MSG_HEAD_LENGTH;
while(nleft>0)
{
nret = recv(pSocket->m_hSocket,&szBuf[index],nleft,0);
index+=nret;
nleft-=nret;
if ((nret == SOCKET_ERROR)||(nret<=0))
{
if(pSocket->m_bThreadEnd)
return 0;
SetEvent(pSocket->m_ReConnectHandle);
if(pSocket!=NULL)
pSocket->OnDisconnect();
return SOCKET_ERROR;
}
}
if(!pSocket->ReceiveMsg(szBuf,nMsgBodyLength+MSG_HEAD_LENGTH))
return 112;
}
return 0;
}
DWORD WINAPI ReConnThread(LPVOID lpParam)
{
CZSocket* pSocket=(CZSocket*)lpParam;
ASSERT(pSocket!=NULL);
pSocket->m_bReconnActive=TRUE;
while(!pSocket->m_bThreadEnd)
{
WaitForSingleObject(pSocket->m_ReConnectHandle,INFINITE);
Sleep(2000);
pSocket->Reconnect();
}
pSocket->m_bReconnActive=FALSE;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -