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

📄 zsocket.cpp

📁 能够实现联通和移动短消息群发的软件
💻 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 + -