⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 masterserver.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -