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

371 lines
8.0 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"
CLoggerServerSocket::CLoggerServerSocket(void)
{
Config.ReadConfig(g_ConfigPath.c_str());
// 设置服务器的基本属性
SetServiceName(Config.SrvConf.szServiceName);
SetServiceHost(Config.SrvConf.szAddr);
SetServicePort(Config.SrvConf.nPort);
SetDbConnection();
m_boCreateTableStoped = TRUE;
m_nextCreateTtableTick =0;
m_dwReconnectSQLTick =0;
}
CLoggerServerSocket::~CLoggerServerSocket(void)
{
}
CCustomServerClientSocket* CLoggerServerSocket::CreateClientSocket(SOCKET nSocket, PSOCKADDR_IN pAddrIn)
{
if (pAddrIn == NULL)
{
return NULL;
}
OutputMsg( rmTip, "接受客户端连接!" );
CLoggerClientSocket* pClientSocket = new CLoggerClientSocket(this,nSocket,pAddrIn);
return pClientSocket;
}
BOOL CLoggerServerSocket::ExecSql(const char* szSql)
{
return TRUE;
}
VOID CLoggerServerSocket::SetDbConnection()
{
Db.SetServerHost(Config.DbConf.szHost);
Db.SetServerPort(Config.DbConf.nPort);
Db.SetDataBaseName(Config.DbConf.szDbName);
Db.SetUserName(Config.DbConf.szUser);
Db.SetPassWord(Config.DbConf.szPassWord);//这个要解密
//多个客户端连接,数据库操作类要加锁
//Db.SetMultiThread(TRUE);
Db.SetConnectionFlags(CLIENT_FOUND_ROWS | CLIENT_MULTI_RESULTS);
BOOL boConnected = Db.Connect();
if (boConnected)
{
if(Config.DbConf.m_bUtf8)
{
//mysql_options(sql.GetMySql(), MYSQL_SET_CHARSET_NAME, "utf8");
mysql_set_character_set(Db.GetMySql(),"utf8");
OutputMsg( rmTip, _T("设置字符编码为utf8"));
}
OutputMsg( rmTip, _T("连接数据库成功"));
}
else
{
OutputMsg( rmError, _T("连接数据库失败"));
}
}
BOOL CLoggerServerSocket::DoStartup()
{
/*
if ( TRUE == InterlockedCompareExchange(&m_boCreateTableStoped, FALSE, TRUE) )
{
m_hCTThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CreateTablesThreadRoutine, this, 0, NULL);
if ( !m_hCTThread )
{
OutputError( GetLastError(), _T("创建检查数据表线程失败!") );
return FALSE;
}
OutputMsg( rmTip, _T("创建检查数据表线程成功!"));
}
*/
return TRUE;
}
VOID CLoggerServerSocket::DoStop()
{
/*
if ( FALSE == InterlockedCompareExchange(&m_boCreateTableStoped, TRUE, FALSE) )
{
CloseThread(m_hCTThread);
}
*/
}
//每次调用
VOID CLoggerServerSocket::SingleRun()
{
ConnectSQL();
CreateTables();
ServerInherited::SingleRun();
}
BOOL CLoggerServerSocket::ConnectSQL()
{
if ( !Db.Connected() )
{
TICKCOUNT nTick = _getTickCount();
if ( nTick >= m_dwReconnectSQLTick )
{
SetDbConnection();
//如果连接SQL失败则将在5秒后重试
m_dwReconnectSQLTick =nTick + 3 * 1000;
return TRUE;
}
else
{
return FALSE;
}
}
return TRUE;
}
VOID CLoggerServerSocket::CreateTables()
{
UINT64 nCurrentTick = _getTickCount();
if(nCurrentTick < m_nextCreateTtableTick)
{
return;
}
int nCount = 0;
const int TOTAL = 3600;
SYSTEMTIME Systime;
GetLocalTime( &Systime );
WORD nDay = Systime.wDay;
WORD nMonth = Systime.wMonth;
WORD nYear = Systime.wYear;
OutputMsg(rmNormal,"create table year=%d,month=%d day= %d",(int)nYear,(int)nMonth,(int)nDay);
bool isSucceed= true; //是否都执行成功
#ifdef WIN32
__try
#endif
{
//生成未来30天的表格
for(int i = 0; i < 30; i++)
{
char date[50];
sprintf(date,"%d%d%d",nYear,nMonth,nDay);
if (Db.Exec(m_szCreateLogin,nYear,nMonth,nDay) != 0)
{
//失败
OutputMsg(rmError,_T("建表失败sql:%s"),m_szCreateLogin);
isSucceed =false;
}
else
{
Db.ResetQuery();
}
if (Db.Exec(m_szCreateOnline,nYear,nMonth,nDay) != 0)
{
//失败
OutputMsg(rmError,_T("建表失败sql: m_szCreateOnline"));
isSucceed =false;
}
else
{
Db.ResetQuery();
}
if (Db.Exec(m_szCreateConsume,nYear,nMonth,nDay) != 0)
{
//失败
OutputMsg(rmError,_T("建表失败sql:m_szCreateConsume"));
isSucceed =false;
}
else
{
Db.ResetQuery();
}
if (Db.Exec(m_szCreateDeal,nYear,nMonth,nDay) != 0)
{
//失败
OutputMsg(rmError,_T("建表失败sql:m_szCreateDeal"));
isSucceed =false;
}
else
{
Db.ResetQuery();
}
if (Db.Exec(m_szCreateItem,nYear,nMonth,nDay) != 0)
{
//失败
OutputMsg(rmError,_T("建表失败sql:m_szCreateItem"));
isSucceed =false;
}
else
{
Db.ResetQuery();
}
if (Db.Exec(m_szCreateDrop,nYear,nMonth,nDay) != 0)
{
//失败
OutputMsg(rmError,_T("建表失败sql:m_szCreateDrop"));
isSucceed =false;
}
else
{
Db.ResetQuery();
}
if (Db.Exec(m_szCreateJoinAtv,nYear,nMonth,nDay) != 0)
{
//失败
OutputMsg(rmError,_T("建表失败sql:m_szCreateJoinAtv"));
isSucceed =false;
}
else
{
Db.ResetQuery();
}
/*
if (Db.Exec(m_szCreateSuggest,nYear,nMonth,nDay) != 0)
{
//失败
OutputMsg(rmError,_T("建表失败sql:m_szCreateSuggest"));
isSucceed =false;
}
else
{
Db.ResetQuery();
}
*/
//下一天
nDay++;
if (nDay > 31)
{
nDay = 1;
nMonth++;
if (nMonth > 12)
{
nMonth = 1;
nYear++;
}
}
}
if(isSucceed)
{
m_nextCreateTtableTick = nCurrentTick + CREATE_TABLE_INTERVAL ; //下次调用是10天以后的事情
OutputMsg(rmNormal,"CreateTables finish,next=%lld,current=%lld",m_nextCreateTtableTick,nCurrentTick);
}
else
{
m_nextCreateTtableTick = nCurrentTick + 30000 ; //10秒以后重新创建表
OutputMsg(rmError,"error,CreateTables !!!");
}
}
#ifdef WIN32
__except(DefaultExceptHandler(GetExceptionInformation()))
{
Db.ResetQuery();
OutputMsg(rmError,"error,CreateTables");
m_nextCreateTtableTick = nCurrentTick +30000;
}
#endif
}
void CLoggerServerSocket::SendOpenChatLogFlag(int nServerIndex,int nFlag)
{
CLoggerClientSocket *pClient;
//OutputMsg(rmTip,"SendOpenChatLogFlag,nServerIndex=%d,nFlag=%d",nServerIndex,nFlag);
int nCount = (int)m_LogClientList.count();
for ( int i= nCount - 1; i>-1; --i )
{
pClient = (CLoggerClientSocket*)m_LogClientList[i];
//如果连接对象是一个逻辑服务器
//OutputMsg(rmTip,"CLoggerClientSocket,nServerIndex=%d",pClient->GetServerIndex());
if ( pClient && pClient->connected() && pClient->registed() && pClient->GetServerIndex() == nServerIndex)
{
//if( pClient->getClientType() == GameServer && pClient->getClientServerIndex() > 0 )
//{
CDataPacket &pdata = pClient->allocProtoPacket(LOG_LOOKCHATMSG_CMD); //分配一个 网络包
pdata << (int)nFlag;
pClient->flushProtoPacket(pdata);
//}
}
}
}
void CLoggerServerSocket::AddServerClient(CLoggerClientSocket* pClient,int Flag)
{
if(pClient)
{
if(Flag == 0)
{
m_LogClientList.add(pClient);
int nServerIndex = pClient->GetServerIndex();
if (GetLogServer()->pChatLogSrv)
{
if (GetLogServer()->pChatLogSrv->IsLogOnServerIndex(nServerIndex))
{
SendOpenChatLogFlag(nServerIndex,1);
}
else
{
//新服链接,聊天监控获取下远程配置信息
GetLogServer()->pChatLogSrv->SendChatGetNewServerList();
}
}
}
else
{
CLoggerClientSocket *tmpClient;
INT_PTR nCount = m_LogClientList.count();
for ( INT_PTR i= nCount - 1; i>-1; --i )
{
tmpClient = (CLoggerClientSocket*)m_LogClientList[i];
if(tmpClient && tmpClient == pClient)
{
m_LogClientList.lock();
m_LogClientList.remove(i);
m_LogClientList.unlock();
break;
}
}
}
}
}
void CLoggerServerSocket::SendShutUpMsg(int nServerIndex,int nType,char* sName,int nTime)
{
CLoggerClientSocket *pClient;
INT_PTR nCount = m_LogClientList.count();
for ( INT_PTR i= nCount - 1; i>-1; --i )
{
pClient = (CLoggerClientSocket*)m_LogClientList[i];
//如果连接对象是一个逻辑服务器
if ( pClient && pClient->connected() && pClient->registed() && pClient->GetServerIndex() == nServerIndex)
{
CDataPacket &pdata = pClient->allocProtoPacket(LOG_SENDCHATRECORD_CMD); //分配一个 网络包
pdata << (int)nServerIndex;
pdata << (int)nType;
pdata.writeString(sName?sName:"");
pdata << (int)nTime;
pClient->flushProtoPacket(pdata);
}
}
}