📄 clientmanager.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : ClientManager.cc// Written By : reiot@ewestsoft.com// Description : //////////////////////////////////////////////////////////////////////////////#include "ClientManager.h"#include "Socket.h"#include "ThreadManager.h"#include "Assert.h"#include "ThreadPool.h"#include "ServerSocket.h"#include "Properties.h"#include "IncomingPlayerManager.h"#include "ZonePlayerManager.h"#include "ZoneGroupManager.h"#include "VariableManager.h"#include "VSDateTime.h"#include "DB.h"#include "UserGateway.h"#include "WarSystem.h"#include "ParkingCenter.h"#include "ctf/FlagManager.h"#include "LocalIP.h"#include <list>#include "TOpackets/GTOAcknowledgement.h"#include "LoginServerManager.h"ClientManager* g_pClientManager = NULL;//////////////////////////////////////////////////////////////////////////////// constructor// 窍困 概聪历 按眉甫 积己茄促.//////////////////////////////////////////////////////////////////////////////ClientManager::ClientManager () throw (Error){ __BEGIN_TRY // create incoming player manager g_pIncomingPlayerManager = new IncomingPlayerManager(); Assert(g_pIncomingPlayerManager != NULL); // 促澜俊 ZoneGroup阑 Balancing且 矫埃阑 瘤沥茄促. getCurrentTime( m_BalanceZoneGroupTime ); m_BalanceZoneGroupTime.tv_sec += 5*60;//g_pVariableManager->getZoneGroupBalancingMinute()*60; m_bForceZoneGroupBalancing = false; m_bDefaultZoneGroupBalancing = false; m_Mutex.setName("ClientManager"); __END_CATCH}//////////////////////////////////////////////////////////////////////////////// destructor// 窍困 概聪历 按眉甫 昏力茄促.//////////////////////////////////////////////////////////////////////////////ClientManager::~ClientManager () throw (Error){ __BEGIN_TRY // Delete incoming player manager SAFE_DELETE(g_pIncomingPlayerManager); __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 窍困 概聪历 按眉甫 檬扁拳茄促.//////////////////////////////////////////////////////////////////////////////void ClientManager::init () throw (Error){ __BEGIN_TRY // initialize incoming player manager g_pIncomingPlayerManager->init(); __END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void ClientManager::stop () throw (Error){ __BEGIN_TRY // 矫弊澄规侥栏肺 唱吝俊 备泅窍档废 茄促. throw UnsupportedError(); __END_CATCH}//////////////////////////////////////////////////////////////////////////////// accept new connection//////////////////////////////////////////////////////////////////////////////void ClientManager::run () throw (Error){ __BEGIN_TRY __BEGIN_DEBUG //ZoneGroup* pZoneGroup = g_pZoneGroupManager->getZoneGroup(1); //ZonePlayerManager* pZonePlayerManager = pZoneGroup->getZonePlayerManager(); //VSTime vstime; Timeval dummyQueryTime; getCurrentTime( dummyQueryTime );#ifdef __CHINA_SERVER__ Timeval theOneAckTime; getCurrentTime( theOneAckTime ); theOneAckTime.tv_sec += 198 * 60;// theOneAckTime.tv_sec += 1 * 60;#endif Timeval userGatewayTime; getCurrentTime(userGatewayTime); userGatewayTime.tv_sec += 10; while (true) { //ofstream file("ClientManager.txt", ios::out | ios::app); //StringStream msg; // CPU 痢蜡啦阑 临捞扁 困秦 0.001檬 悼救 疆促. try { // I/O Multiplexing usleep(100); //g_pIncomingPlayerManager->copyPlayers(); // game global time setting setCurrentTime(); //vstime.start(); g_pIncomingPlayerManager->select(); //file << "IncomingPlayerManagerSelect:" << vstime.elapsed() << endl; //vstime.restart(); g_pIncomingPlayerManager->processExceptions(); //file << "IncomingPlayerManagerException:" << vstime.elapsed() << endl; //vstime.restart(); g_pIncomingPlayerManager->processInputs(); //file << "IncomingPlayerManagerInput:" << vstime.elapsed() << endl; //vstime.restart(); g_pIncomingPlayerManager->processOutputs(); //file << "IncomingPlayerManagerOutput:" << vstime.elapsed() << endl; } catch (TimeoutException&) { // select()俊辑 timeout捞 惯积窍搁, 捞饶俊 且 老捞 窍唱档 绝促. // 官肺 促澜 风橇肺 逞绢啊搁 登摆促.. } catch (Error&) { throw; } catch (Throwable& t) { filelog("clientManagerBug.txt", "%s", t.toString().c_str()); } //vstime.start(); g_pIncomingPlayerManager->processCommands(); //file << "IncomingPlayerManagerCommands:" << vstime.elapsed() << endl; /* try { pZonePlayerManager->select(); pZonePlayerManager->processExceptions(); pZonePlayerManager->processInputs(); pZonePlayerManager->processOutputs(); } catch (TimeoutException) { } pZonePlayerManager->processCommands(); pZoneGroup->heartbeat(); */ //usleep(100); // 泅犁 矫埃阑 螟沥秦辑, 30檬付促 ConnectionInfoManager 俊辑 // expire 等 ConnectionInfo 甫 昏力茄促. g_pIncomingPlayerManager->heartbeat(); //vstime.start(); g_pConnectionInfoManager->heartbeat(); //file << "ConnectionInfoManagerHeartbeat:" << vstime.elapsed() << endl; //file.close(); Timeval currentTime; getCurrentTime(currentTime); if (dummyQueryTime < currentTime) { g_pDatabaseManager->executeDummyQuery( g_pDatabaseManager->getDistConnection("PLAYERDB") ); // 1矫埃 ~ 1矫埃 30盒 荤捞俊辑 dummy query 矫埃阑 汲沥茄促. // timeout捞 登瘤 臼霸 窍扁 困秦辑捞促. dummyQueryTime.tv_sec += (60+rand()%30) * 60; }#ifdef __CHINA_SERVER__ if ( theOneAckTime < currentTime ) { list<string> ips = getLocalIP(); list<string>::iterator itr = ips.begin(); list<string>::iterator endItr = ips.end(); for ( ; itr != endItr ; ++itr ) { string& myIP = *itr;// cout << "My IP Address is : " << myIP << endl; GTOAcknowledgement GTO; GTO.setServerIP( myIP ); GTO.setServerType( 0 ); g_pLoginServerManager->sendPacket( "61.78.53.244", 9981, >O ); } theOneAckTime.tv_sec += ( 180 + rand()%300 ) * 60; }#endif if (m_BalanceZoneGroupTime < currentTime) { g_pZoneGroupManager->balanceZoneGroup(m_bForceZoneGroupBalancing, m_bDefaultZoneGroupBalancing); m_BalanceZoneGroupTime.tv_sec = currentTime.tv_sec + g_pVariableManager->getZoneGroupBalancingMinute()*60; m_bForceZoneGroupBalancing = false; m_bDefaultZoneGroupBalancing = false; } // by sigi. 2002.12.30 if (userGatewayTime < currentTime) { if (UserGateway::getInstance()->getTotalInfo() > 0) { int ZonePlayerNum = g_pZoneGroupManager->getPlayerNum(); int IncomingPlayerNum = g_pIncomingPlayerManager->size(); int TotalPlayerNum = ZonePlayerNum + IncomingPlayerNum; filelog("userGateway.log", "Users(%d+%d=%d), %s", ZonePlayerNum, IncomingPlayerNum, TotalPlayerNum, UserGateway::getInstance()->toString().c_str()); UserGateway::getInstance()->clear(); } // 10檬 饶 促矫 眉农 userGatewayTime.tv_sec += 10; } // by sigi. 2002.9.26 if (!m_EventManager.isEmpty()) { try { g_pZoneGroupManager->lockZoneGroups(); __ENTER_CRITICAL_SECTION(m_Mutex) m_EventManager.heartbeat(); __LEAVE_CRITICAL_SECTION(m_Mutex) g_pZoneGroupManager->unlockZoneGroups(); } catch (Throwable& t) { filelog("eventManagerBug.txt", "ClientManager::EventManager::heartbeat - %s", t.toString().c_str()); g_pZoneGroupManager->unlockZoneGroups(); } } // 傈里~ if (g_pVariableManager->isWarActive()) { g_pWarSystem->heartbeat(); } if (g_pVariableManager->isActiveFlagWar()) { g_pFlagManager->heartbeat(); } // 瘤况霖促. g_pParkingCenter->heartbeat(); // CPU 痢蜡啦阑 临捞扁 困秦 0.001檬 悼救 疆促. } //while __END_DEBUG __END_CATCH}void ClientManager::setBalanceZoneGroup(int afterMinutes, bool bForce, bool bDefault){ getCurrentTime(m_BalanceZoneGroupTime); m_BalanceZoneGroupTime.tv_sec += afterMinutes*60; m_bForceZoneGroupBalancing = bForce; m_bDefaultZoneGroupBalancing = bDefault;}//--------------------------------------------------------------------------------////--------------------------------------------------------------------------------void ClientManager::addEvent (Event* pEvent) throw (Error){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) addEvent_LOCKED( pEvent ); __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH}//--------------------------------------------------------------------------------////--------------------------------------------------------------------------------void ClientManager::addEvent_LOCKED (Event* pEvent) throw (Error){ __BEGIN_TRY // 捞固 乐绰吧 瘤款促. m_EventManager.deleteEvent(pEvent->getEventClass()); m_EventManager.addEvent(pEvent); __END_CATCH}//--------------------------------------------------------------------------------////--------------------------------------------------------------------------------bool ClientManager::deleteEvent (Event::EventClass EClass) throw (Error){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) m_EventManager.deleteEvent(EClass); __LEAVE_CRITICAL_SECTION(m_Mutex) return true; __END_CATCH}//////////////////////////////////////////////////////////////////////////////// get debug string//////////////////////////////////////////////////////////////////////////////string ClientManager::toString () const throw (Error){ __BEGIN_TRY StringStream msg; msg << "ClientManager()"; return msg.toString(); __END_CATCH}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -