📄 basesocket.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 + -