📄 zsocket.cpp
字号:
///////////////////////////////////////////////////////////////////
// ZSocket.h: interface for the CZSocket class.
// 创建人:钟广荣
// 创建时间:5.28
// 功能:封装SOCKET 通信接口的实现函数
///////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ZSocket.h"
#include "MsgHead.h"
//#include "GlobalVar.h"
extern char g_szServerIP[20];
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//线程:接收信息Socket内容
DWORD WINAPI recvMsgThread(LPVOID lpParam);
//重新连接线程
DWORD WINAPI ReConnThread(LPVOID lpParam);
CZSocket::CZSocket()
{
m_bUseNetByte=FALSE;
m_ErrorNo=0;
ReConnectHandle=NULL;
m_hSocket=-1;
m_bInit=FALSE;
m_bConnect=FALSE;
m_bThreadEnd=FALSE;
m_bServerOk=FALSE;
m_bServerSocket=-1;
m_ReConnectHandle=NULL;
m_bReconnActive=FALSE;
m_RecvHandle=NULL;
}
CZSocket::CZSocket(BOOL bUseNetByte)
{
m_bUseNetByte=bUseNetByte;
m_ErrorNo=0;
m_hSocket=-1;
m_bInit=FALSE;
m_RecvHandle=NULL;
m_bConnect=FALSE;
m_bThreadEnd=FALSE;
m_bServerOk=FALSE;
m_bServerSocket=-1;
m_ReConnectHandle=NULL;
ReConnectHandle=NULL;
m_bReconnActive=FALSE;
}
CZSocket::~CZSocket()
{
//EndRecvThread();
//if(!m_bThreadEnd)
// CloseSocket();
m_hSocket=-1;
}
int CZSocket::GetTheLassError()
{
return m_ErrorNo;
}
BOOL CZSocket::Attach(CZSocket* pZSocket)
{
ASSERT(pZSocket!=NULL);
ASSERT(pZSocket->m_hSocket!=INVALID_SOCKET);
pZSocket->CreateRecvThread(pZSocket);
return TRUE;
}
BOOL CZSocket::Detach()
{
EndRecvThread();
return TRUE;
}
BOOL CZSocket::CloseSocket(BOOL bNotClose)
{
m_bThreadEnd=TRUE;
if(m_hSocket==-1) return FALSE;
shutdown(m_hSocket,SD_BOTH);
EndRecvThread();
m_ErrorNo=closesocket(m_hSocket);
m_hSocket=-1;
Sleep(20);
//结束重新连接线程
if(m_bServerSocket==0)
{
if(ReConnectHandle)
TerminateThread(ReConnectHandle,0);
}
if(m_ReConnectHandle)
CloseHandle(m_ReConnectHandle);
if(ReConnectHandle)
CloseHandle(ReConnectHandle);
if(m_RecvHandle)
CloseHandle(m_RecvHandle);
//change by zgr 8-6
m_ReConnectHandle=NULL;
ReConnectHandle=NULL;
m_RecvHandle=NULL;
return TRUE;
}
BOOL CZSocket::InitClientSocket(char* pServerIp,int nPort)
{
if(m_bInit)
{
m_ErrorNo=101;
return FALSE;
}
sockaddr_in SockAddr;
m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_hSocket == INVALID_SOCKET)
{
m_ErrorNo=INVALID_SOCKET;
return FALSE;
}
m_bServerSocket=0;
if(pServerIp!=NULL)
strcpy(m_Ip,pServerIp);
m_nPort=nPort;
if(pServerIp!=NULL)
{
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)
{
m_ErrorNo=SOCKET_ERROR;
DWORD dwThreadId;
if(m_ReConnectHandle==NULL)
m_ReConnectHandle=CreateEvent(NULL,true,false,NULL);
if(m_ReConnectHandle==NULL)
MessageBox(NULL,"创建事件对象失败!","错误提示",0);
//重连接
SetEvent(m_ReConnectHandle);
ReConnectHandle = CreateThread(NULL, 0, ReConnThread,
this, 0, &dwThreadId);
if(ReConnectHandle==NULL)
MessageBox(NULL,"创建自动重连线程失败!","错误提示",0);
return FALSE;
}
m_bConnect=TRUE;
m_bServerSocket=0;
CreateRecvThread(this);
}
OnConnected();
m_bInit=TRUE;
return TRUE;
}
void CZSocket::OnReConnected()
{
}
BOOL CZSocket::InitServerSocket(int nBindPort)
{
if(m_bInit)
{
m_ErrorNo=101;
return FALSE;
}
sockaddr_in SockAddr;
m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_hSocket == INVALID_SOCKET)
{
m_ErrorNo=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("192.168.0.4");
//SockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
SockAddr.sin_addr.s_addr = inet_addr(g_szServerIP);
SockAddr.sin_family=AF_INET;
char* ip=inet_ntoa(SockAddr.sin_addr);
SockAddr.sin_port=htons(nBindPort);
if(SOCKET_ERROR==bind(m_hSocket,(sockaddr*)&SockAddr,sizeof(SockAddr)))
return FALSE;
if(SOCKET_ERROR==listen(m_hSocket,SOMAXCONN))
return FALSE;
m_bInit=TRUE;
m_bServerSocket=1;
m_bServerOk=TRUE;
strcpy(m_Ip,ip);
m_nPort=nBindPort;
return TRUE;
}
///ASSERT(rConnectedSocket.m_hSocket == INVALID_SOCKET);
BOOL CZSocket::ConnectToServer(char* pServerIp,int nPort)
{
ASSERT(m_hSocket == INVALID_SOCKET);
sockaddr_in SockAddr;
if(m_bConnect) return FALSE;
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)
{
m_ErrorNo=SOCKET_ERROR;
return FALSE;
}
m_bServerSocket=0;
CreateRecvThread(this);
m_bConnect=TRUE;
strcpy(m_Ip,pServerIp);
m_nPort=nPort;
return TRUE;
}
void CZSocket::Reconnect()
{
//if(!m_bInit) return;
if(m_bServerSocket!=0) return;
sockaddr_in SockAddr;
// Added By LiaoJian
if (m_hSocket != -1)
{
shutdown(m_hSocket,SD_BOTH);
closesocket(m_hSocket);
}
// End;
m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_hSocket == INVALID_SOCKET)
{
m_ErrorNo=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)
{
m_ErrorNo=SOCKET_ERROR;
return ;
}
m_bConnect=TRUE;
CreateRecvThread(this);
m_bInit=TRUE;
OnReConnected();
OnConnected();
}
BOOL CZSocket::AcceptSocket(CZSocket& ZClientSocket)
{
if(!m_bServerOk) return FALSE;
if(m_hSocket == INVALID_SOCKET) return FALSE;
if(ZClientSocket.m_hSocket != INVALID_SOCKET) return FALSE;
sockaddr_in SockAddr;
int buflen=sizeof(sockaddr_in);
ZClientSocket.m_hSocket=accept(m_hSocket,(sockaddr*)&SockAddr,&buflen);
if(ZClientSocket.m_hSocket==0)
return FALSE;
char* pServerIp=inet_ntoa(SockAddr.sin_addr);
strcpy(ZClientSocket.m_Ip,pServerIp);
ZClientSocket.m_nPort=ntohs(SockAddr.sin_port);
if(ZClientSocket.m_hSocket==INVALID_SOCKET)
return FALSE;
ZClientSocket.m_bServerSocket=1;
ZClientSocket.m_bReconnActive=FALSE;
ZClientSocket.m_bThreadEnd=FALSE;
ZClientSocket.CreateRecvThread(&ZClientSocket);
return TRUE;
}
BOOL CZSocket::SendMsg(char Buff[],int BufLen)
{
if(m_hSocket == INVALID_SOCKET) 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,UINT nCommandID,UINT SequenceID)
{
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)
MessageBox(NULL,"创建事件对象失败!","错误提示",0);
//停止重连的执行
ResetEvent(m_ReConnectHandle);
DWORD dwThreadId;
m_RecvHandle = CreateThread(NULL, 0, recvMsgThread,
pZSocket, 0, &dwThreadId);
if(m_RecvHandle==NULL)
MessageBox(NULL,"创建接收线程失败!","错误提示",0);
if((m_bServerSocket==0)&&(!m_bReconnActive)&&(ReConnectHandle==NULL))
{
ReConnectHandle = CreateThread(NULL, 0, ReConnThread,
pZSocket, 0, &dwThreadId);
if(ReConnectHandle==NULL)
MessageBox(NULL,"创建自动重连线程失败!","错误提示",0);
}
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 buff[1024];
int ret;
int codeID=0;
UINT nleft=0;
int index;
UINT MsgBodyLength=0;
CMsgHead m_MsgHead;
while(!pSocket->m_bThreadEnd)
{
ZeroMemory(buff,1024);
m_MsgHead.ResetBuff();
ret = recv(pSocket->m_hSocket, buff, CMPP_MSG_HEAD_LENGTH, 0);
if ((ret == SOCKET_ERROR)||(ret<=0))//||(ret!=CMPP_MSG_HEAD_LENGTH))
{
if(pSocket->m_bThreadEnd)
return 0;
if(pSocket->m_bServerSocket==0)
SetEvent(pSocket->m_ReConnectHandle);
if(pSocket!=NULL)
pSocket->OnDisconnect();
return SOCKET_ERROR;
}
//Add 11-16
nleft=CMPP_MSG_HEAD_LENGTH-ret;
index=ret;
while(nleft>0)
{
ret = recv(pSocket->m_hSocket, &buff[index],nleft,0);
index+=ret;
nleft-=ret;
if ((ret == SOCKET_ERROR)||(ret<=0))
{
if(pSocket->m_bThreadEnd)
return 0;
if(pSocket->m_bServerSocket==0)
SetEvent(pSocket->m_ReConnectHandle);
if(pSocket!=NULL)
pSocket->OnDisconnect();
return SOCKET_ERROR;
}
}
//end
m_MsgHead.SetBuf(buff);
if(!pSocket->m_bUseNetByte)
MsgBodyLength=m_MsgHead.GetMsgHead().Total_Length-CMPP_MSG_HEAD_LENGTH;
else
MsgBodyLength=ntohl(m_MsgHead.GetMsgHead().Total_Length)-CMPP_MSG_HEAD_LENGTH;
nleft=MsgBodyLength;
if(nleft>1024)
{
//pSocket->SendMsg
TRACE("MESSAGE LENGTH ERROR\n");
if(pSocket!=NULL)
pSocket->OnDisconnect();
return 1;
}
ASSERT(nleft<=1012);
//TRACE("\n%d",nleft+12);
index=CMPP_MSG_HEAD_LENGTH;
while(nleft>0)
{
ret = recv(pSocket->m_hSocket, &buff[index],nleft,0);
index+=ret;
nleft-=ret;
if ((ret == SOCKET_ERROR)||(ret<=0))
{
if(pSocket->m_bThreadEnd)
return 0;
if(pSocket->m_bServerSocket==0)
SetEvent(pSocket->m_ReConnectHandle);
if(pSocket!=NULL)
pSocket->OnDisconnect();
return SOCKET_ERROR;
}
}
if(!pSocket->ReceiveMsg(buff,m_MsgHead.GetMsgHead().Total_Length,m_MsgHead.GetMsgHead().Command_ID,m_MsgHead.GetMsgHead().Sequence_ID))
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 + -