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

📄 basesocket.cpp

📁 能够实现联通和移动短消息群发的软件
💻 CPP
字号:
// BaseSocket.cpp: implementation of the CBaseSocket class.
// 创建人:  杨祖明
// 创建时间:2001-11-20
// 功能:    通信SOCKET
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "BaseSocket.h"
#include "ComManager.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CComManager gMsgManager;
//定义连接监测线程
DWORD WINAPI ActiveTestThread(LPVOID lpParam);

CBaseSocket::CBaseSocket(BOOL bUseNetByte):CZSocket(bUseNetByte)
{
	m_SeqID = 1;
	m_bActive = FALSE;
	m_bTestThreadEnd = FALSE;
	CreateActiveTestThread();
}
CBaseSocket::~CBaseSocket()
{
	m_bTestThreadEnd = TRUE;
	Sleep(500);
	CloseSocket();
}

//网络断开
BOOL CBaseSocket::OnDisconnect()
{
	m_bActive = FALSE;
	//???显示与平台的连接断开
	return TRUE;
}
void CBaseSocket::OnConnected()
{
	//此处进行应用层连接操作
	BYTE cCount = 0;
	LoginToServer();
}
//
BOOL CBaseSocket::ReceiveMsg(char Buff[],UINT BuffLen)
{
	//检查数据包是否正确
	if(Buff==NULL || BuffLen<=0)
		return FALSE;

	DWORD dwCommandID;
	dwCommandID = ntohl(*(DWORD*)&Buff[4]);

	switch(dwCommandID)
	{
	case CTKP_CONNECT_RSP:
		if(BuffLen != sizeof(STRUCT_CONNECT_RSP))
		{
			//???显示错误信息
			return TRUE;
		}
		ConnectRsp(Buff);
		break;
	case CTKP_DISC_RSP:
		if(BuffLen != sizeof(STRUCT_DISC_RSP))
		{
			//???显示错误信息
			return TRUE;
		}
		if(DiscRsp(Buff))
			return FALSE;
		break;
	case CTKP_LINKTEST_RSP:
		if(BuffLen != sizeof(STRUCT_LINKTEST_RSP))
		{
			//???显示错误信息
			return TRUE;
		}
		LinkTestRsp(Buff);
		break;
	case CTKP_DELIVERY:
		Delivery(Buff,BuffLen);
		break;
	case CTKP_MSG_REPORT:
		if(BuffLen != sizeof(STRUCT_MSG_REPORT))
		{
			//???显示错误信息
			return TRUE;
		}
		MsgReport(Buff);
		break;
	case CTKP_SUBMIT_RSP:
		if(BuffLen != sizeof(STRUCT_SUBMIT_RSP))
		{
			//???显示错误信息
			return TRUE;
		}
		SubmitRsp(Buff);
		break;
	case CTKP_ERROR_REPORT:
		if(BuffLen != sizeof(STRUCT_ERROR_REPORT))
		{
			//???显示错误信息
			return TRUE;
		}
		ErrorReport(Buff);
		break;
	default:
		//???收到一条不能识别的命令,显示错误信息
		return TRUE;
		break;
	}
	return TRUE;
}


BOOL CBaseSocket::CreateActiveTestThread()
{
	//创建连接检测线程
	DWORD dwThreadID=0;
	HANDLE hHaddle=CreateThread(NULL, 0, ActiveTestThread,
		                               this, 0, &dwThreadID);
	if(hHaddle==NULL)
		return FALSE;
	else
		return TRUE;
}


//连接监测线程
DWORD WINAPI ActiveTestThread(LPVOID lpParam)
{
	CBaseSocket *pBaseSocket = (CBaseSocket*)lpParam;
	int nCount = 0;

	while(!pBaseSocket->m_bTestThreadEnd)
	{
		if(pBaseSocket->m_bActive && (nCount >= 100))
		{
			nCount = 0;
		    pBaseSocket->SendActiveTestMsg();
		}

		//每隔60秒发送连接测试消息
		Sleep(500);
		nCount++;
	}
	return 0;
}

//连接测试消息发送
BOOL CBaseSocket::SendActiveTestMsg()
{
	STRUCT_LINKTEST sLinkTest;
	sLinkTest.sHeader.dwTotalLen = htonl(sizeof(STRUCT_LINKTEST));
	sLinkTest.sHeader.dwCommandId = htonl(CTKP_LINKTEST);
	sLinkTest.sHeader.dwSeqNo = htonl(CTKP_TESTMSG_SEQID);

	if(m_bActive)
		SendMsg((char*)&sLinkTest,sizeof(STRUCT_LINKTEST));

	return TRUE;
}

void CBaseSocket::_SetAppLoginInfo(STRUCT_APPLOGIN_INFO sAppLoginInfo)
{
	memcpy((void*)&m_sAppLoginInfo,(void*)&sAppLoginInfo,sizeof(STRUCT_APPLOGIN_INFO));
}

BOOL CBaseSocket::InitClient(STRUCT_SERVER_INFO sServerInfo,STRUCT_APPLOGIN_INFO sAppLoginInfo)
{
	_SetAppLoginInfo(sAppLoginInfo);
	return InitClientSocket(sServerInfo.szIP,sServerInfo.nPort);
}

BOOL CBaseSocket::LoginToServer()
{
	//登陆到服务器
	STRUCT_CONNECT sConnect;

	sConnect.sHeader.dwCommandId=htonl(CTKP_CONNECT);
	sConnect.sHeader.dwSeqNo=htonl(_GETSEQID());
	sConnect.sHeader.dwTotalLen=htonl(sizeof(STRUCT_CONNECT));

	strncpy(sConnect.szAppName,m_sAppLoginInfo.szAppName,sizeof(m_sAppLoginInfo.szAppName));
	strncpy(sConnect.szPassword,m_sAppLoginInfo.szPassword,sizeof(m_sAppLoginInfo.szPassword));
	sConnect.wAppID=htons(m_sAppLoginInfo.wAppID);

	//发送到平台
	return SendMsg((char*)&sConnect,sizeof(STRUCT_CONNECT));
}

void CBaseSocket::LinkTestRsp(char buf[])
{
	//显示收到连接测试应答
	gMsgManager.ProcessLinkTestRsp(buf);
}
extern BOOL g_bUpdateEnable; 
BOOL CBaseSocket::ConnectRsp(char buf[])
{
	ASSERT(buf);
	STRUCT_CONNECT_RSP* sConnectRsp=(STRUCT_CONNECT_RSP*)buf;

	gMsgManager.ProcessConnectRsp(buf);

	if(ntohl(sConnectRsp->sHeader.dwStatus) == 0)
	{
		//登陆成功
		m_bActive = TRUE;
        gMsgManager.ShowInfo("已经登陆成功\r\n"); 
		return TRUE;
	}
	else
	{
		//登陆失败
		m_bActive = CONNECT_FAIL;
		
		gMsgManager.ShowInfo("登陆不成功\r\n");
		return FALSE;
	}
}

BOOL CBaseSocket::DiscRsp(char buf[])
{
	//显示收到断开应答消息
	m_bActive = FALSE;
	Sleep(600);
	gMsgManager.ProcessDiscRsp(buf);
	return TRUE;
}

BOOL CBaseSocket::ErrorReport(char buf[])
{
	gMsgManager.ProcessErrorReport(buf);
	return TRUE;
}

BOOL CBaseSocket::MsgReport(char buf[])
{
	STRUCT_MSG_REPORT*	psMsgReport;
	STRUCT_RECV_CONFIRM sRecvConfirm;

	psMsgReport = (STRUCT_MSG_REPORT*)buf;

	sRecvConfirm.sHeader.dwCommandId = htonl(CTKP_RECV_CONFIRM);
	sRecvConfirm.sHeader.dwSeqNo = psMsgReport->sHeader.dwSeqNo;
	sRecvConfirm.sHeader.dwTotalLen = htonl(sizeof(STRUCT_RECV_CONFIRM));
	sRecvConfirm.cConfirm_Flag = MSGREPORT_RSP_CONFIRM_FLAG;

	if(m_bActive)
		SendMsg((char*)&sRecvConfirm,sizeof(STRUCT_RECV_CONFIRM));

	//???交由COMMANAGER处理
	gMsgManager.ProcessMsgReport(buf);
	return TRUE;
}

BOOL CBaseSocket::SubmitRsp(char buf[])
{
	//???交由COMMANAGER处理
	gMsgManager.ProcessSubmitRsp(buf);
	return TRUE;
}

BOOL CBaseSocket::Delivery(char buf[],DWORD dwBufLen)
{
	STRUCT_DELIVERY*	psDelivery;
	STRUCT_RECV_CONFIRM sRecvConfirm;

	psDelivery = (STRUCT_DELIVERY*)buf;

	sRecvConfirm.sHeader.dwCommandId = htonl(CTKP_RECV_CONFIRM);
	sRecvConfirm.sHeader.dwSeqNo = psDelivery->sDeliveryHeader.sHeader.dwSeqNo;
	sRecvConfirm.sHeader.dwTotalLen = htonl(sizeof(STRUCT_RECV_CONFIRM));
	sRecvConfirm.cConfirm_Flag = DELIVER_RSP_CONFIRM_FLAG;

	if(m_bActive)
		SendMsg((char*)&sRecvConfirm,sizeof(STRUCT_RECV_CONFIRM));

	//???交由COMMANAGER处理
	gMsgManager.ProcessDelivery(buf,dwBufLen);
	return TRUE;
}

BOOL CBaseSocket::Disc()
{
	if(!m_bActive)
		return FALSE;
	STRUCT_DISC sDisc;
	sDisc.sHeader.dwCommandId = htonl(CTKP_DISC);
	sDisc.sHeader.dwSeqNo = htonl(_GETSEQID());
	sDisc.sHeader.dwTotalLen = htonl(sizeof(STRUCT_DISC));

	if(m_bActive)
		return SendMsg((char*)&sDisc,sizeof(STRUCT_DISC));
	else
		return FALSE;
}

DWORD CBaseSocket::SubmitMsg(STRUCT_SUBMIT sSubmit)
{
	DWORD dwSubmitLen;
	
	dwSubmitLen = sizeof(STRUCT_SUBMIT)-sizeof(sSubmit.sCMPP12Submit.szMsg_Content)+ntohs(sSubmit.sCMPP12Submit.wMsg_Length);
	sSubmit.sSubmitHeader.sHeader.dwTotalLen = htonl(dwSubmitLen);
	sSubmit.sSubmitHeader.sHeader.dwSeqNo = htonl(_GETSEQID());
	sSubmit.sSubmitHeader.sHeader.dwCommandId = htonl(CTKP_SUBMIT);

	sSubmit.sCMPP12Submit.sHeader.dwCommand_ID = htonl(CMPP12_SUBMIT);
	sSubmit.sCMPP12Submit.sHeader.dwTotal_Length = htonl(dwSubmitLen-sizeof(STRUCT_SUBMIT_HEADER));
	sSubmit.sSubmitHeader.wProtocol_Length = htons((WORD)ntohl(sSubmit.sCMPP12Submit.sHeader.dwTotal_Length));

	if(m_bActive)
	{
		if(SendMsg((char*)&sSubmit,dwSubmitLen))
			return ntohl(sSubmit.sSubmitHeader.sHeader.dwSeqNo);
		else
			return 0;
	}
	else
		return 0;
}
BOOL CBaseSocket::ReSubmitMsg(STRUCT_SUBMIT sSubmit)
{
	if(m_bActive)
		return SendMsg((char*)&sSubmit,ntohl(sSubmit.sSubmitHeader.sHeader.dwTotalLen));
	else
		return FALSE;
}

DWORD CBaseSocket::_GETSEQID()
{
	return m_SeqID>=0x7FFFFFFF?m_SeqID=1 : m_SeqID++;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -