📄 masterserver.cpp
字号:
#include "stdafx.h"
#include <conio.h>
#include <IOCPServer.h>
#include <GMList.h>
#include "MasterServer.h"
#include "ServerSession.h"
#include "AccountDBProxySession.h"
#include "OpServerSession.h"
#include "PacketHandler.h"
#include "ServerSessionFactory.h"
#include "ServerSessionManager.h"
#include "ServerInfoManager.h"
#include "MasterServerInfoParser.h"
// 辆丰 橇肺配妮 困秦
#include "Protocol_ServerCommon.h"
#include "PacketStruct_ServerCommon.h"
#include "PacketStruct_MO.h"
// 滚傈 嘛扁
#include <Version.h>
#include <ServerBuildVersion.h>
#include <ServerGlobal.h>
//=================================================================================================
// 妮归窃荐
//=================================================================================================
NetworkObject* CreateAcceptedObject()
{
ServerSession *pServerSession = ServerSessionFactory::Instance()->AllocServerSession( TEMP_SERVER );
return (NetworkObject*)pServerSession;
}
//=================================================================================================
// 妮归窃荐
//=================================================================================================
VOID DestroyAcceptedObject( NetworkObject *pNetworkObject )
{
ServerSessionFactory::Instance()->FreeServerSession( (ServerSession*)pNetworkObject );
}
//=================================================================================================
// 妮归窃荐
//=================================================================================================
VOID DestroyConnectedObject( NetworkObject *pNetworkObject )
{
}
MasterServer::MasterServer()
{
m_pIOCPServer = NULL;
m_bShutdown = FALSE;
m_pAccountDBProxySession = NULL;
m_pOpServerSession = NULL;
m_pServerMoneyInfoTable = NULL;
}
MasterServer::~MasterServer()
{
if( m_pIOCPServer ) delete m_pIOCPServer;
if( m_pAccountDBProxySession ) delete m_pAccountDBProxySession;
if( m_pOpServerSession ) delete m_pOpServerSession;
ASSERT( m_pServerMoneyInfoTable );
}
VOID MasterServer::Release()
{
m_pIOCPServer->Shutdown();
if( m_pAccountDBProxySession )
{
m_pAccountDBProxySession->Release();
}
if( m_pOpServerSession )
{
m_pOpServerSession->Release();
}
GMList::Instance()->Release();
m_pServerMoneyInfoTable->RemoveAll();
SAFE_DELETE( m_pServerMoneyInfoTable );
m_bExitServer = FALSE;
m_bSendExit = FALSE;
m_pExitServerTable->RemoveAll();
SAFE_DELETE( m_pExitServerTable );
SAFE_DELETE(g_pSunLog);
}
BOOL MasterServer::Init()
{
// INI 颇老 颇教
if( !MasterServerInfoParser::Instance()->ParseINI( "MasterServer.ini" ) )
{
printf( "MasterServer.ini parsing failed.\n" );
return FALSE;
}
// 滚傈 嘛扁
#ifdef _DEBUG
DisplayDebugInfo( GetServerType(), TRUE, C2S_HIGH_VERSION_NO, C2S_MIDDLE_VERSION_NO, C2S_LOW_VERSION_NO, SERVER_RELEASE_BUILD_NO, 0, 0, 1 );
#else
DisplayDebugInfo( GetServerType(), FALSE, C2S_HIGH_VERSION_NO, C2S_MIDDLE_VERSION_NO, C2S_LOW_VERSION_NO, SERVER_RELEASE_BUILD_NO, 0, 0, 1 );
#endif
//SUN Log File 檬扁拳
g_pSunLog = new CSunLog;
SUNLOG_INFO* pSunLogInfo = MasterServerInfoParser::Instance()->GetSunLogInfo();
if(g_pSunLog->Init(pSunLogInfo->bySunLogOption, (BYTE)pSunLogInfo->wSunLogfileLevel,
pSunLogInfo->pszSunLogfilePath, "Master") == false)
{
//SunLog甫 父甸瘤 臼嚼聪促.
}
// IO 浚柳 牢胶畔胶 积己 棺 檬扁拳
m_pIOCPServer = new IOCPServer;
IOHANDLER_DESC desc;
desc.dwIoHandlerKey = IOHANDLER_KEY;
desc.dwMaxAcceptSession = MasterServerInfoParser::Instance()->GetIoDesc()->dwMaxAcceptSession;
desc.dwMaxConnectSession = MasterServerInfoParser::Instance()->GetIoDesc()->dwMaxConnectSession;
desc.dwSendBufferSize = MasterServerInfoParser::Instance()->GetIoDesc()->dwSendBufferSize;
desc.dwRecvBufferSize = MasterServerInfoParser::Instance()->GetIoDesc()->dwRecvBufferSize;
desc.dwTimeOut = MasterServerInfoParser::Instance()->GetIoDesc()->dwTimeOut;
desc.dwMaxPacketSize = MasterServerInfoParser::Instance()->GetIoDesc()->dwMaxPacketSize;
desc.dwNumberOfIoThreads = MasterServerInfoParser::Instance()->GetIoDesc()->dwNumberOfIoThreads;
desc.dwNumberOfAcceptThreads = MasterServerInfoParser::Instance()->GetIoDesc()->dwNumberOfAcceptThreads;
desc.dwNumberOfConnectThreads = MasterServerInfoParser::Instance()->GetIoDesc()->dwNumberOfConnectThreads;
desc.fnCreateAcceptedObject = CreateAcceptedObject;
desc.fnDestroyAcceptedObject = DestroyAcceptedObject;
desc.fnDestroyConnectedObject = DestroyConnectedObject;
m_pIOCPServer->Init( &desc, 1 );
/*
// GM List 肺爹
GMList::Instance()->Load( "data\\GMList.txt" );
*/
// 菩哦 勤甸矾 殿废
PacketHandler::Instance()->RegisterHandler_DM();
PacketHandler::Instance()->RegisterHandler_MX();
PacketHandler::Instance()->RegisterHandler_BM();
PacketHandler::Instance()->RegisterHandler_FM();
PacketHandler::Instance()->RegisterHandler_GM();
PacketHandler::Instance()->RegisterHandler_AM();
PacketHandler::Instance()->RegisterHandler_MW();
PacketHandler::Instance()->RegisterHandler_MO();
m_pAccountDBProxySession = (AccountDBProxySession*)ServerSessionFactory::Instance()->AllocServerSession( ACCOUNT_DBPROXY );
m_pOpServerSession = (OpServerSession*)ServerSessionFactory::Instance()->AllocServerSession( OP_SERVER );
// DB Proxy 辑滚 楷搬 沥焊 技泼
m_pAccountDBProxySession->SetAddr( MasterServerInfoParser::Instance()->GetAccountDBProxyIP(),
MasterServerInfoParser::Instance()->GetAccountDBProxyPort() );
printf( "Account DB proxy address(%s:%d)\n", MasterServerInfoParser::Instance()->GetAccountDBProxyIP(),
MasterServerInfoParser::Instance()->GetAccountDBProxyPort() );
// Op Server 楷搬 沥焊 技泼
m_pOpServerSession->SetAddr( MasterServerInfoParser::Instance()->GetOpServerIP(),
MasterServerInfoParser::Instance()->GetOpServerPort() );
MessageOut( eCRITICAL_LOG, "Op server address(%s:%d)", MasterServerInfoParser::Instance()->GetOpServerIP(),
MasterServerInfoParser::Instance()->GetOpServerPort() );
m_ReconnectTimer.SetTimer( 1000 );
// 辑滚 烹拳樊 沥焊 檬扁拳
m_pServerMoneyInfoTable = new util::SolarHashTable<SERVER_MONEY_INFO*>;
m_pServerMoneyInfoTable->Initialize( 100 );
// 辑滚 辆丰 沥焊 檬扁拳
m_bExitServer = FALSE;
m_bSendExit = FALSE;
m_pExitServerTable = new util::SolarHashTable<SERVER_KEY*>;
m_pExitServerTable->Initialize( 50 ); // 弥措 50俺 辑滚 辆丰 啊瓷?
m_ExitTimer.SetTimer( 10000 ); // 辆丰 览翠 措扁 矫埃阑 10檬肺
m_ExitTimer.DisableCheckTime();
return TRUE;
}
VOID MasterServer::StartListen()
{
// DB Proxy俊 楷搬等 饶俊 府郊 矫累
if( !m_pIOCPServer->IsListening( IOHANDLER_KEY ) )
{
char szMasterServerIP[MAX_IPADDRESS_SIZE];
WORD wMasterServerPort;
strcpy( szMasterServerIP, MasterServerInfoParser::Instance()->GetMasterServerIP() );
wMasterServerPort = MasterServerInfoParser::Instance()->GetMasterServerPort();
if( !m_pIOCPServer->StartListen( IOHANDLER_KEY, szMasterServerIP, wMasterServerPort ) )
{
MessageOut( eCRITICAL_LOG, "*** Listen failed. ***" );
Shutdown();
}
else
{
MessageOut( eCRITICAL_LOG, "Listen started...(%s:%d)", szMasterServerIP, wMasterServerPort );
}
}
// Account DB pxory 技记篮 DB 沥焊甫 罐篮 瘤陛 矫痢俊 辑滚 技记 概聪廉俊 眠啊
SERVER_KEY serverKey = ServerInfoManager::Instance()->GetServerKey( ACCOUNT_DBPROXY, (char*)m_pAccountDBProxySession->GetConnectIP().c_str() );
if( !ServerSessionManager::Instance()->FindServer( serverKey ) )
{
// 辑滚 沥焊甫 诀单捞飘 窍绰 版快 肚 眠啊窍瘤 臼霸阐 辑滚虐肺 茫酒夯 饶俊 眠啊
m_pAccountDBProxySession->SetServerKey( serverKey );
ServerSessionManager::Instance()->AddServer( m_pAccountDBProxySession );
}
// Op Server 技记篮 DB 沥焊甫 罐篮 瘤陛 矫痢俊 辑滚 技记 概聪廉俊 眠啊
SERVER_KEY opServerKey = ServerInfoManager::Instance()->GetServerKey( OP_SERVER, (char*)m_pOpServerSession->GetConnectIP().c_str() );
if( !ServerSessionManager::Instance()->FindServer( opServerKey ) )
{
// 辑滚 沥焊甫 诀单捞飘 窍绰 版快 肚 眠啊窍瘤 臼霸阐 辑滚虐肺 茫酒夯 饶俊 眠啊
m_pOpServerSession->SetServerKey( opServerKey );
ServerSessionManager::Instance()->AddServer( m_pOpServerSession );
}
}
VOID MasterServer::Run()
{
// Account DB Proxy俊 立加 矫档
ConnectToServer( m_pAccountDBProxySession, (char*)m_pAccountDBProxySession->GetConnectIP().c_str(), m_pAccountDBProxySession->GetConnectPort() );
// Op Server俊 立加矫档
ConnectToServer( m_pOpServerSession, (char*)m_pOpServerSession->GetConnectIP().c_str(), m_pOpServerSession->GetConnectPort() );
// 皋牢 风橇
while( !m_bShutdown )
{
Sleep( 10 );
if( !Update() ) break;
}
}
BOOL MasterServer::Update()
{
// I/O 浚柳 诀单捞飘
m_pIOCPServer->Update();
UpdateFPS();
// 能贾贸府
if( ProcessConsole() == FALSE )
{
return FALSE; // 辑滚 辆丰
}
if( m_ReconnectTimer.IsExpired() )
{
MaintainConnection();
}
return TRUE;
}
VOID MasterServer::MaintainConnection()
{
// 付胶磐 辑滚啊 辆丰吝捞搁 府畔
if( m_bShutdown ) return;
// Account DB proxy客 楷搬捞 谗绢廉 乐栏搁 促矫 立加阑 矫档茄促.
if( !m_pAccountDBProxySession->IsConnected() && !m_pAccountDBProxySession->GetConnectIP().empty() )
{
ConnectToServer( m_pAccountDBProxySession, (char*)m_pAccountDBProxySession->GetConnectIP().c_str(), m_pAccountDBProxySession->GetConnectPort() );
}
/*
// 趣矫 公郊 捞蜡肺 OpServer啊 NULL捞搁
if( ServerSessionManager::Instance()->GetOpServer() == NULL )
{
// m_pOpServerSession苞 嘎苗霖促
ServerSessionManager::Instance()->AddServer( m_pOpServerSession );
}
*/
// Op Server客 楷搬捞 谗绢廉 乐栏搁 犁立加
if( !m_pOpServerSession->IsConnected() && !m_pOpServerSession->GetConnectIP().empty() )
{
ConnectToServer( m_pOpServerSession, (char*)m_pOpServerSession->GetConnectIP().c_str(), m_pOpServerSession->GetConnectPort() );
}
// 沥惑辆丰 疙飞阑 WOPS俊辑 罐疽绰瘤 check窍绊 鞘夸茄 辆丰 苞沥 荐青
if( CheckExitServer() )
{
Shutdown();
}
}
BOOL MasterServer::ProcessConsole()
{
if( kbhit() )
{
char ch = getch();
ch = toupper(ch);
switch(ch)
{
case 0x1b:
return FALSE;
case ' ':
DisplayServerInfo();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -