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

491 lines
12 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;
CLoggerClientSocket::CLoggerClientSocket(void)
{
}
CLoggerClientSocket::CLoggerClientSocket(CLoggerServerSocket* pSrv,SOCKET nSocket, SOCKADDR_IN *pClientAddr)
{
this->pSrv = pSrv;
this->m_pSQLConnection = pSrv->GetSqlConnection();
this->SetClientSocket(nSocket,pClientAddr);
#ifndef WIN32
this->m_pLocalSender = new CLocalSender();
#endif
}
CLoggerClientSocket::~CLoggerClientSocket(void)
{
OutputMsg(rmNormal,_T("log client[%s] Destroy"),getClientName());
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();
#ifndef WIN32
if(this->m_pLocalSender)
delete this->m_pLocalSender;
#endif
}
bool CLoggerClientSocket::OnValidateRegData(const jxSrvDef::PSERVER_REGDATA pRegData)
{
//游戏服和db能够登陆
if ( pRegData && pRegData->GameType == SERVER_REGDATA::GT_JianXiaoJiangHu &&
( pRegData->ServerType == GameServer || pRegData->ServerType == DBServer
|| pRegData->ServerType == SessionServer) )
{
return true;
}
else
{
return false;
}
}
VOID CLoggerClientSocket::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)
{
int nServerIndex = 0;
CDataPacket* pDataPatck = m_dataList[0];
CDataPacketReader inPacket(pDataPatck->getMemoryPtr(),pDataPatck->getPosition());
inPacket >> nCmd ;
#ifdef WIN32
__try
#endif
{
switch(nCmd)
{
case LOG_LOGIN_CMD: //登陆日志
InsertLogin(inPacket);
break;
case LOG_CONSUME_CMD: //消费日志
InsertConsume(inPacket);
break;
case LOG_DEAL_CMD: //交易日志
InsertDeal(inPacket);
break;
case LOG_ITEAM_CMD: //道具日志
InsertItem(inPacket);
break;
case LOG_ONLINE_CMD: //在线日志
InsertOnline(inPacket);
break;
case LOG_KILLDROP_CMD: //击杀掉落日志
InsertKillDrop(inPacket);
break;
case LOG_JOINATV_CMD: //
InsertJoinAtv(inPacket);
break;
case LOG_COMMON_CMD: //公共操作日志
break;
case LOG_SUGGEST_CMD: //建议
//InsertSuggest(inPacket);
break;
case LOG_SENDSERVERINDEX_CMD:
inPacket >> nServerIndex;
m_nServerIndex = nServerIndex;
if(GetLogServer() && GetLogServer()->pLoggerSrv)
{
GetLogServer()->pLoggerSrv->AddServerClient(this);
GetLogServer()->pLoggerSrv->SendOpenChatLogFlag(nServerIndex,1);
}
break;
case LOG_SENDCHATRECORD_CMD: //聊天记录
SendChatLogToClient(inPacket);
break;
default:
break;
}
}
#ifdef WIN32
__except(DefaultExceptHandler(GetExceptionInformation()))
{
m_pSQLConnection->ResetQuery();
}
#endif
m_freeDataList.add(pDataPatck);
m_dataList.remove(0); // 删除此消息
//如果执行的时间大于200毫秒则退出执行
TICKCOUNT nCurrentTick = _getTickCount() ;
if(nCurrentTick - nStartTick > 200)
{
break;
}
}
}
VOID CLoggerClientSocket::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 CLoggerClientSocket::InsertLogin(CDataPacketReader &inPacket)
{
LOGDATALOGIN data;
inPacket >> data;
data.szAccount[sizeof(data.szAccount)-1]=0;
data.szLoginDescr[sizeof(data.szLoginDescr)-1] =0;
data.szLoginIp[sizeof(data.szLoginIp)-1] =0;
data.szSpid[sizeof(data.szSpid)-1] = 0;
SYSTEMTIME st;
GetLocalTime(&st);
char szSql[1024];
char sztime[1024] = {0};
// struct tm gm = {st.wSecond, st.wMinute, st.wHour, st.wDay, st.wMonth-1, st.wYear-1900, st.wDayOfWeek, 0, 0};
// int time1 = mktime(&gm);
// sprintf(sztime,"%d/%02d/%02d %02d:%02d:%02d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond); //actotID
sprintf(szSql,m_szLoginLogSql,st.wYear,st.wMonth,st.wDay,
data.nLogid,data.nUserid,data.szAccount,data.nServerIndex,
data.szLoginIp,data.nServerType,data.szLoginDescr,data.szSpid,data.nLevel, data.nYb, data.nOnlineTime,data.nSrvId);
int nResult = m_pSQLConnection->RealExec(szSql,strlen(szSql));
// printf("%s\n",szSql);
BOOL bReturn = FALSE;
if (nResult != 0)
{
//执行插入操作出错,要记录文本日志
char szError[1024];
sprintf(szError,_T("exec sql error!!:%s"),szSql);
OutputMsg( rmError, szError);
}
else
{
//释放结果集
m_pSQLConnection->ResetQuery();
}
}
VOID CLoggerClientSocket::InsertConsume(CDataPacketReader &inPacket)
{
LOGDATACONSUME data;
inPacket >> data;
data.szAccount[sizeof(data.szAccount)-1]=0;
data.szCharName[ sizeof(data.szCharName)-1] =0;
data.szConsumeDescr[sizeof(data.szConsumeDescr)-1] =0;
data.szSpid[sizeof(data.szSpid)-1] = 0;
SYSTEMTIME st;
GetLocalTime(&st);
char szSql[2048];
char sztime[1024] = {0};
// sprintf(sztime,"%d/%02d/%02d %02d:%02d:%02d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond); //actotID
sprintf(szSql,m_szConsumeLogSql,st.wYear,st.wMonth,st.wDay,
data.nLogid,data.nActorid,data.szAccount,data.nServerIndex,
data.szCharName,data.cMoneytype,data.nConsumecount,data.nPaymentCount,data.szConsumeDescr,data.nConsumeLevel,data.nBalance,data.szSpid,data.nSrvId);
int nResult = m_pSQLConnection->RealExec(szSql,strlen(szSql));
BOOL bReturn = FALSE;
if (nResult != 0)
{
//执行插入操作出错,要记录文本日志
OutputMsg( rmError, _T("exec sql error!!:%s"),szSql);
}
else{
//释放结果集
m_pSQLConnection->ResetQuery();
}
}
VOID CLoggerClientSocket::InsertDeal(CDataPacketReader &inPacket)
{
LOGACTORDEALSAVE data;
inPacket >> data;
data.szSpid[sizeof(data.szSpid)-1] = 0;
SYSTEMTIME st;
GetLocalTime(&st);
char szSql[2048];
sprintf(szSql,m_szDealLogSql,st.wYear,st.wMonth,st.wDay,
data.nServerIndex, data.nLogId, data.nMiniTime, data.nActorid, data.nTarActorid, data.nItemId, data.nItemNum, data.nMoneyType, data.nMoneyNum, data.nDues, data.szSpid,data.nSrvId);
int nResult = m_pSQLConnection->RealExec(szSql,strlen(szSql));
BOOL bReturn = FALSE;
if (nResult != 0)
{
//执行插入操作出错,要记录文本日志
OutputMsg( rmError, _T("exec sql error!!:%s"),szSql);
}
else{
//释放结果集
m_pSQLConnection->ResetQuery();
}
}
VOID CLoggerClientSocket::InsertItem(CDataPacketReader &inPacket)
{
LOGDATAITEM data;
inPacket >> data;
data.szAccount[sizeof(data.szAccount)-1]=0;
data.szCharName[ sizeof(data.szCharName)-1] =0;
data.szConsumeDescr[sizeof(data.szConsumeDescr)-1] =0;
data.szSpid[sizeof(data.szSpid)-1] = 0;
SYSTEMTIME st;
GetLocalTime(&st);
char szSql[2048];
char sztime[1024] = {0};
// sprintf(sztime,"%d/%02d/%02d %02d:%02d:%02d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond); //actotID
sprintf(szSql,m_szItemLogSql,st.wYear,st.wMonth,st.wDay,
data.nLogid,data.nActorid,data.szAccount,data.nServerIndex,
data.szCharName,data.nType,data.wItemId,data.nCount,data.szConsumeDescr,data.szSpid,data.nSrvId);
int nResult = m_pSQLConnection->RealExec(szSql,strlen(szSql));
BOOL bReturn = FALSE;
if (nResult != 0)
{
//执行插入操作出错,要记录文本日志
OutputMsg( rmError, _T("exec sql error!!:%s"),szSql);
}
else{
//释放结果集
m_pSQLConnection->ResetQuery();
}
}
VOID CLoggerClientSocket::InsertOnline(CDataPacketReader &inPacket)
{
LOGDATAONLINECOUNT data;
inPacket >> data;
data.szSpid[sizeof(data.szSpid)-1] = 0;
SYSTEMTIME st;
GetLocalTime(&st);
char szSql[1024];
char sztime[1024] = {0};
// sprintf(sztime,"%d/%02d/%02d %02d:%02d:%02d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond); //actotID
sprintf(szSql,m_szOnlineLogSql,st.wYear,st.wMonth,st.wDay,
data.nServerIndex,data.nOnlineCount,data.szSpid);
int nResult = m_pSQLConnection->RealExec(szSql,strlen(szSql));
BOOL bReturn = FALSE;
if (nResult != 0)
{
//执行插入操作出错,要记录文本日志
OutputMsg( rmError, _T("exec sql error!!:%s"),szSql);
}
else
{
//释放结果集
m_pSQLConnection->ResetQuery();
}
}
/*
VOID CLoggerClientSocket::InsertSuggest(CDataPacketReader &inPacket)
{
LOGGERDATASUGGEST data;
inPacket >> data;
data.szAccount[sizeof(data.szAccount) -1]=0;
data.szCharName[sizeof(data.szCharName) -1]=0;
data.szTitle[sizeof(data.szTitle) -1]=0;
data.szSuggest[sizeof(data.szSuggest) -1]=0;
//替换避免出现字符串把sql出错了
INT_PTR nCount= strlen(data.szTitle);
for(INT_PTR i=0; i<nCount; i++ )
{
if( data.szTitle[i] =='`' || data.szTitle[i] == '\'')
{
data.szTitle[i]= '!';
}
}
nCount= strlen(data.szSuggest);
for(INT_PTR i=0; i<nCount; i++ )
{
if( data.szSuggest[i] =='`' || data.szSuggest[i] == '\'')
{
data.szSuggest[i]= '!';
}
}
SYSTEMTIME st;
GetLocalTime(&st);
char szSql[1024];
sprintf(szSql,m_szSuggestLogSql,st.wYear,st.wMonth,st.wDay,
data.szAccount, data.nServerIndex,data.szCharName,data.nType,data.szTitle,data.szSuggest,data.nActorLevel);
int nResult = m_pSQLConnection->RealExec(szSql,strlen(szSql));
BOOL bReturn = FALSE;
if (nResult != 0)
{
//执行插入操作出错,要记录文本日志
OutputMsg( rmError, _T("exec sql error!!:%s"),szSql);
}
else
{
//释放结果集
m_pSQLConnection->ResetQuery();
}
}
*/
VOID CLoggerClientSocket::OnDisconnected()
{
if(GetLogServer() && GetLogServer()->pLoggerSrv)
{
GetLogServer()->pLoggerSrv->AddServerClient(this,1);
}
}
void CLoggerClientSocket::SendChatLogToClient(CDataPacketReader &inPacket)
{
int nChannleID = 0;
inPacket >> nChannleID;
int nActorId = 0;
inPacket >> nActorId;
char sActorName[32];
inPacket.readString(sActorName,ArrayCount(sActorName));
char msg[1024];
inPacket.readString(msg,ArrayCount(msg));
//OutputMsg(rmTip,"SendChatLogToClient,nServerIndex=%d,nChannleID=%d",m_nServerIndex,nChannleID);
#ifdef WIN32
if(GetLogServer() && GetLogServer()->pChatLogSrv)
{
GetLogServer()->pChatLogSrv->SendChatRecordToAll(m_nServerIndex,nChannleID,nActorId,sActorName,msg);
}
#else
if(m_pLocalSender && m_pLocalSender->IsInUse())
m_pLocalSender->SendMsgToSP(m_nServerIndex,nChannleID,nActorId,sActorName,msg);
#endif
}
VOID CLoggerClientSocket::InsertKillDrop(CDataPacketReader &inPacket)
{
LOGKILLDROP data;
inPacket >> data;
SYSTEMTIME st;
GetLocalTime(&st);
char szSql[1024];
char sztime[1024] = {0};
sprintf(szSql,m_szdropLogSql,st.wYear,st.wMonth,st.wDay,
data.nActorid,data.srtAccount,data.nServerIndex,
data.strName,data.strMonsetName,data.strSceneName,data.strItemName,data.nCount,data.nKilltime,data.nPosx,data.nPosy,data.nSrvId);
int nResult = m_pSQLConnection->RealExec(szSql,strlen(szSql));
BOOL bReturn = FALSE;
if (nResult != 0)
{
//执行插入操作出错,要记录文本日志
OutputMsg( rmError, _T("exec sql error!!:%s"),szSql);
}
else
{
//释放结果集
m_pSQLConnection->ResetQuery();
}
}
VOID CLoggerClientSocket::InsertJoinAtv(CDataPacketReader &inPacket)
{
LOGATVSCHEDULE data;
inPacket >> data;
SYSTEMTIME st;
GetLocalTime(&st);
char szSql[1024];
char sztime[1024] = {0};
sprintf(szSql,m_szAtvLogSql,st.wYear,st.wMonth,st.wDay,
data.nActorid,data.srtAccount,data.nServerIndex,
data.strName,data.nAtvID,data.nJoinTime,data.nIndex,data.nSrvId);
int nResult = m_pSQLConnection->RealExec(szSql,strlen(szSql));
BOOL bReturn = FALSE;
if (nResult != 0)
{
//执行插入操作出错,要记录文本日志
OutputMsg( rmError, _T("exec sql error!!:%s"),szSql);
}
else
{
//释放结果集
m_pSQLConnection->ResetQuery();
}
}