Files
mir_server/server/LoggerServer/ChatLogClientSocket.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

268 lines
5.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stdafx.h"
using namespace jxSrvDef;
CChatLogClientSocket::CChatLogClientSocket(void)
{
}
CChatLogClientSocket::CChatLogClientSocket(CChatLogServerSocket* Srv,SOCKET nSocket, SOCKADDR_IN *pClientAddr)
{
if(Srv)
{
pSrv = Srv;
this->m_pSQLConnection = pSrv->GetSqlConnection();
}
this->SetClientSocket(nSocket,pClientAddr);
m_nCount = 0;
}
CChatLogClientSocket::~CChatLogClientSocket(void)
{
OutputMsg(rmNormal,_T("chat log client Destroy"));
for(int i = 0; i < m_dataList.count(); i++)
{
CDataPacket* dp = m_dataList[i];
dp->setPosition(0);
flushSendPacket(*dp);
}
m_dataList.clear();
for(int i = 0; i < m_freeDataList.count(); i++)
{
CDataPacket* dp = m_freeDataList[i];
dp->setPosition(0);
flushSendPacket(*dp);
}
m_freeDataList.clear();
}
bool CChatLogClientSocket::OnValidateRegData(const jxSrvDef::PSERVER_REGDATA pRegData)
{
OutputMsg(rmTip,"Chat ClientLogin");
//游戏服和db能够登陆
if ( pRegData )/* && pRegData->GameType == SERVER_REGDATA::GT_JianXiaoJiangHu &&
( pRegData->ServerType == GameServer || pRegData->ServerType == DBServer
|| pRegData->ServerType == SessionServer) )*/
{
return true;
}
else
{
return false;
}
}
VOID CChatLogClientSocket::OnRun()
{
Inherited::OnRun();
//没有连接上就不处理
/*
if(!m_pSQLConnection->Connected())
{
return;
}
*/
//OutputMsg(rmTip,"SingleRun thread id=%d",(int)GetCurrentThread());
jxSrvDef::INTERSRVCMD nCmd =0;
TICKCOUNT nStartTick = _getTickCount(); //获取当前的时间tick
while(m_dataList.count() >0)
{
CDataPacket* pDataPatck = m_dataList[0];
CDataPacketReader inPacket(pDataPatck->getMemoryPtr(),pDataPatck->getPosition());
inPacket >> nCmd ;
//OutputMsg(rmTip,"Rcv Chat Client Msg ID=%d",(int)nCmd);
#ifdef WIN32
__try
#endif
{
switch(nCmd)
{
case REV_CHECKSEVERINDEX_CMD: //查看日志
OnRevLookServerIndex(inPacket);
break;
case REV_SHUTUPCHAT_CMD: //禁言
OnRevShutUpOp(inPacket);
break;
default:
break;
}
}
#ifdef WIN32
__except(DefaultExceptHandler(GetExceptionInformation()))
{
//m_pSQLConnection->ResetQuery();
OutputMsg(rmError,"Error,Rcv Msg ID=%d",(int)nCmd);
}
#endif
m_freeDataList.add(pDataPatck);
m_dataList.remove(0); // 删除此消息
//如果执行的时间大于200毫秒则退出执行
TICKCOUNT nCurrentTick = _getTickCount() ;
if(nCurrentTick - nStartTick > 200)
{
break;
}
}
}
VOID CChatLogClientSocket::OnDispatchRecvPacket(const jxSrvDef::INTERSRVCMD nCmd, CDataPacketReader &inPacket)
{
if (!pSrv || nCmd ==0)
{
return;
}
#ifdef WIN32
__try
#endif
{
//如果数据不够每次都申请512个数据包
if(m_freeDataList.count() <=0 )
{
allocSendPacketList(m_freeDataList, 512);
}
CDataPacket* pDataPatck = m_freeDataList.pop();//得到一个空闲的Datapacket
pDataPatck->setPosition(0);
//TRACE("free m_TempData:%d\n",(int)(m_TempData));
//复制到内存块中
(*pDataPatck) << nCmd;
pDataPatck->writeBuf(inPacket.getOffsetPtr(),inPacket.getLength());
m_dataList.add(pDataPatck);
//OutputMsg(rmTip,"OnDispatchRecvPacket thread id=%d,ncmd=%d",(int)GetCurrentThread(),(int)nCmd);
//每次都申请一批数据包
/*
*/
}
#ifdef WIN32
__except(DefaultExceptHandler(GetExceptionInformation()))
{
OutputMsg(rmError,"error,nCmd=%d",nCmd);
}
#endif
}
VOID CChatLogClientSocket::OnRevLookServerIndex(CDataPacketReader &inPacket)
{
int nServerIndex = 0;
inPacket >> nServerIndex;
int nFlag = 0;
inPacket >> nFlag;
//OutputMsg(rmTip,"OnRevLookServerIndex,nServerIndex=%d,nFlag = %d",nServerIndex,nFlag);
if(nServerIndex <= 0) return;
for(int i=0;i<m_nCount;i++)
{
if(nServerIndex == m_ServerList[i])
{
return;
}
}
if(nFlag == 1 && GetLogServer() && GetLogServer()->pLoggerSrv)
{
if(m_nCount < MAXCOUNTSERVER)
{
m_ServerList[m_nCount] = nServerIndex;
m_nCount++;
}
GetLogServer()->pLoggerSrv->SendOpenChatLogFlag(nServerIndex,1);
}
if(nFlag == 0 && GetLogServer() && GetLogServer()->pChatLogSrv)
{
RemoveSerindex(nServerIndex);
if (!GetLogServer()->pChatLogSrv->IsLogOnServerIndex(nServerIndex))
{
GetLogServer()->pLoggerSrv->SendOpenChatLogFlag(nServerIndex,0);
}
}
//CDataPacket &pdata = allocProtoPacket(SEND_CHATLOG_CMD); //分配一个 网络包
//pdata << (int)nServerIndex;
//pdata.writeString("test chat");
//flushProtoPacket(pdata);
}
VOID CChatLogClientSocket::OnRevShutUpOp(CDataPacketReader &inPacket)
{
int nServerIndex = 0;
inPacket >> nServerIndex;
int nType = 0;
inPacket >> nType;
char sName[32];
inPacket.readString(sName,ArrayCount(sName));
int nTime = 0;
inPacket >> nTime;
GetLogServer()->pLoggerSrv->SendShutUpMsg(nServerIndex,nType,sName,nTime);
}
void CChatLogClientSocket::RemoveSerindex(int nIndex)
{
for(int i=0;i<m_nCount;i++)
{
if(m_ServerList[i] == nIndex)
{
for(int j=i;j<m_nCount-1;j++)
{
m_ServerList[j] = m_ServerList[j+1];
}
m_nCount--;
break;
}
}
}
VOID CChatLogClientSocket::OnDisconnected()
{
for(int i=m_nCount-1;i>=0;i--)
{
int nServerIndex = m_ServerList[i];
RemoveSerindex(nServerIndex);
if (GetLogServer() && GetLogServer()->pChatLogSrv && !GetLogServer()->pChatLogSrv->IsLogOnServerIndex(nServerIndex))
{
if (GetLogServer()->pLoggerSrv)
{
GetLogServer()->pLoggerSrv->SendOpenChatLogFlag(nServerIndex,0);
}
}
}
if(GetLogServer() && GetLogServer()->pChatLogSrv)
{
GetLogServer()->pChatLogSrv->AddLogServerClient(this,1);
}
}