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

📄 gameservermanager.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////////////////////// Filename    : GameServerManager.cpp// Written by  : reiot@ewestsoft.com// Description : //////////////////////////////////////////////////////////////////////////////#include <stdio.h>#include "GameServerManager.h"#include "Assert.h"#include "SocketAPI.h"#include "Socket.h"#include <algorithm>#include "Properties.h"#include "Packet.h"//////////////////////////////////////////////////////////////////////////////// constructor// 窍困 概聪历 棺 单捞鸥 糕滚甸阑 积己茄促.//////////////////////////////////////////////////////////////////////////////GameServerManager::GameServerManager () 	throw (Error): m_pServerSocket(NULL), m_SocketID(INVALID_SOCKET), m_MinFD(-1), m_MaxFD(-1){	__BEGIN_TRY	m_Mutex.setName("GameServerManager");	try 	{		// create  server socket		m_pServerSocket = new ServerSocket(g_pConfig->getPropertyInt("TCPPort"));		m_pServerSocket->setNonBlocking();		// 辑滚 家南 叼胶农赋磐甫 瘤沥茄促.		m_SocketID = m_pServerSocket->getSOCKET();	} 	catch (NoSuchElementException & nsee) 	{		// 券版 颇老俊 弊繁 element啊 绝阑 版快		throw Error(nsee.toString());	}	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// destructor//////////////////////////////////////////////////////////////////////////////GameServerManager::~GameServerManager () 	throw (Error){	__BEGIN_TRY	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// 窍困 概聪历 棺 单捞磐 糕滚甫 檬扁拳茄促.//////////////////////////////////////////////////////////////////////////////void GameServerManager::init ()	throw (Error){	__BEGIN_TRY	// fd_set 甸阑 0 栏肺 檬扁拳茄促.	FD_ZERO(&m_ReadFDs[0]);	FD_ZERO(&m_WriteFDs[0]);	FD_ZERO(&m_ExceptFDs[0]);	//  辑滚 家南狼 厚飘甫 囊促. (write 绰 眉农且 鞘夸啊 绝促.)	FD_SET(m_SocketID , &m_ReadFDs[0]);	FD_SET(m_SocketID , &m_ExceptFDs[0]);	// set min/max fd	m_MinFD = m_MaxFD = m_SocketID;	// m_Timeout 阑 檬扁拳茄促.	// 唱吝俊绰 捞 林扁 开矫 可记栏肺 贸府窍档废 窍磊.	m_Timeout[0].tv_sec = 0;	m_Timeout[0].tv_usec = 0;	__END_CATCH}void GameServerManager::run()	throw ( Error ){	__BEGIN_TRY	__BEGIN_DEBUG	try {		while ( true )		{			try			{				usleep(100);				select();				processInputs();				processOutputs();			}			catch ( Throwable& t )			{				filelog( "SSGSManager.txt", "%s", t.toString().c_str() );			}			processCommands();		}	} catch (Throwable& t) {		filelog("cbillingserverBug.txt", "%s", t.toString().c_str());		throw;	}	__END_DEBUG	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void GameServerManager::broadcast (Packet* pPacket)	throw (Error){	__BEGIN_TRY	__ENTER_CRITICAL_SECTION(m_Mutex)	try	{		for (int i = m_MinFD ; i <= m_MaxFD ; i ++) {			if (i != m_SocketID && m_pGameServerPlayers[i] != NULL)				m_pGameServerPlayers[i]->sendPacket(pPacket);		}	}	catch ( ProtocolException e )	{		filelog( "SSException.log", "%s\n%s", e.toString().c_str(), pPacket->toString().c_str() );	}    __LEAVE_CRITICAL_SECTION(m_Mutex)	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void GameServerManager::broadcast (Packet* pPacket, Player* pPlayer)	throw (Error){	__BEGIN_TRY	__ENTER_CRITICAL_SECTION(m_Mutex)	for (int i = m_MinFD ; i <= m_MaxFD ; i ++) {		if (i != m_SocketID && m_pGameServerPlayers[i] != NULL && m_pGameServerPlayers[i] != pPlayer )			m_pGameServerPlayers[i]->sendPacket(pPacket);	}    __LEAVE_CRITICAL_SECTION(m_Mutex)	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// call select() system call// 惑困俊辑 TimeoutException 阑 罐栏搁 敲饭捞绢绰 贸府窍瘤 臼酒档 等促.//////////////////////////////////////////////////////////////////////////////void GameServerManager::select ()	throw (TimeoutException , InterruptedException , Error){	__BEGIN_TRY	//__ENTER_CRITICAL_SECTION(m_Mutex)	// m_Timeout[0] 阑 m_Timeout[1] 栏肺 汗荤茄促.	m_Timeout[1].tv_sec  = m_Timeout[0].tv_sec;	m_Timeout[1].tv_usec = m_Timeout[0].tv_usec;	// m_XXXFDs[0] 阑 m_XXXFDs[1] 栏肺 汗荤茄促.	m_ReadFDs[1]   = m_ReadFDs[0];	m_WriteFDs[1]  = m_WriteFDs[0];	m_ExceptFDs[1] = m_ExceptFDs[0];	try 	{		// 捞力 m_XXXFDs[1] 阑 啊瘤绊 select() 甫 龋免茄促.		SocketAPI::select_ex(m_MaxFD + 1 , &m_ReadFDs[1] , &m_WriteFDs[1] , &m_ExceptFDs[1] , &m_Timeout[1]);	} 	catch (InterruptedException & ie) 	{		// 矫弊澄捞 棵 府啊 决骂~~		//log(LOG_GAMESERVER_ERROR, "", "", ie.toString());	}	//__LEAVE_CRITICAL_SECTION(m_Mutex)		__END_CATCH}//////////////////////////////////////////////////////////////////////////////// process all players' inputs// 辑滚 家南狼 read flag啊 难脸阑 版快, 货肺款 立加捞 甸绢吭栏骨肺// 捞甫 贸府窍绊, 促弗 家南狼 read flag啊 难脸阑 版快, 货肺款 菩哦捞// 甸绢吭栏骨肺 弊 敲饭捞绢狼 processInput()阑 龋免窍搁 等促.//////////////////////////////////////////////////////////////////////////////void GameServerManager::processInputs () 	throw (IOException , Error){	__BEGIN_TRY	//__ENTER_CRITICAL_SECTION(m_Mutex)    if (m_MinFD == -1 && m_MaxFD == -1) // no player exist	{ 		//m_Mutex.unlock();		return;	}	for (int i = m_MinFD ; i <= m_MaxFD ; i ++) 	{		if (FD_ISSET(i , &m_ReadFDs[1])) 		{			if (i == m_SocketID) 			{				//  辑滚 家南老 版快 货肺款 楷搬捞 档馒沁促绰 舵捞促.				acceptNewConnection();			} 			else 			{				if (m_pGameServerPlayers[i] != NULL) 				{					GameServerPlayer* pGameServerPlayer = m_pGameServerPlayers[i];					Assert(pGameServerPlayer != NULL);					Assert(m_pGameServerPlayers[i] != NULL);					if (pGameServerPlayer->getSocket()->getSockError()) 					{						try 						{							// 捞固 楷搬捞 辆丰登菌栏骨肺, 免仿 滚欺甫 敲矾矫秦辑绰 救等促.							pGameServerPlayer->disconnect(DISCONNECTED);						} 						catch (Throwable & t) 						{							cerr << t.toString() << endl;						}						deleteGameServerPlayer(i);						delete pGameServerPlayer;					} 					else 					{						try 						{							pGameServerPlayer->processInput();						} 						catch (ConnectException & ce) 						{							// Blocking 家南捞骨肺, ConnectException苞 Error甫 力寇茄 绢恫 抗寇档 惯积窍瘤 臼绰促.							// 楷搬捞 谗板阑 版快, 肺弊窍绊 敲饭捞绢 沥焊甫 历厘茄 饶俊 (肺靛登菌促搁)							// 敲饭捞绢 按眉甫 昏力茄促.							try 							{								pGameServerPlayer->disconnect();							} 							catch (Throwable & t) 							{								cerr << t.toString() << endl;							}							deleteGameServerPlayer(i);							delete pGameServerPlayer;						}					} // else				} // else			} // if		}	}//	__LEAVE_CRITICAL_SECTION(m_Mutex)	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// process all players' commands//////////////////////////////////////////////////////////////////////////////void GameServerManager::processCommands() 	throw (IOException , Error){	__BEGIN_TRY	__BEGIN_DEBUG	//__ENTER_CRITICAL_SECTION(m_Mutex)	if (m_MinFD == -1 && m_MaxFD == -1) // no player exist	{ 		//m_Mutex.unlock();		return;	}	//copyPlayers();	for (int i = m_MinFD ; i <= m_MaxFD ; i ++) 	{		if (i != m_SocketID && m_pGameServerPlayers[i] != NULL) 		{			GameServerPlayer* pGameServerPlayer = m_pGameServerPlayers[i];			Assert(pGameServerPlayer != NULL);			Assert(m_pGameServerPlayers[i] != NULL);			if (pGameServerPlayer->getSocket()->getSockError()) 			{				try 				{					// 捞固 楷搬捞 辆丰登菌栏骨肺, 免仿 滚欺甫 敲矾矫秦辑绰 救等促.					pGameServerPlayer->disconnect();				} 				catch (Throwable & t) 				{					cerr << t.toString() << endl;				}				deleteGameServerPlayer(i);				delete pGameServerPlayer;			} 			else 			{				try 				{					pGameServerPlayer->processCommand();				} 				catch (ProtocolException & pe) 				{					try 					{						pGameServerPlayer->disconnect();						cout << pe.toString().c_str() << endl;					} 					catch (Throwable & t) 					{						cerr << t.toString() << endl;					}					deleteGameServerPlayer(i);					delete pGameServerPlayer;				}			}		}	}	//__LEAVE_CRITICAL_SECTION(m_Mutex)	__END_DEBUG	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// process all players' outputs//////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -