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

📄 zsocket.cpp

📁 模拟手机源程序,做短信系统(源码)
💻 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 + -