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

📄 gameservermanager.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	__END_DEBUG	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// process all players' outputs//////////////////////////////////////////////////////////////////////////////void GameServerManager::processOutputs () 	throw (IOException , Error){	__BEGIN_TRY	//__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 (FD_ISSET(i , &m_WriteFDs[1])) 		{			if (i == m_SocketID) throw IOException("server socket's write bit is selected.");			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;					}					GameServerPlayer* pGameServerPlayer = pGameServerPlayer;					deleteGameServerPlayer(i);					delete pGameServerPlayer;				} 				else 				{					try 					{						pGameServerPlayer->processOutput();					} 					catch (ConnectException & ce) 					{						StringStream msg;						msg << "DISCONNECT " << pGameServerPlayer->getID() 							<< "(" << ce.toString() << ")";						//log(LOG_GAMESERVER_ERROR, "", "", msg.toString());						try 						{							// 捞固 楷搬捞 辆丰登菌栏骨肺, 免仿 滚欺甫 敲矾矫秦辑绰 救等促.							pGameServerPlayer->disconnect(DISCONNECTED);						} 						catch (Throwable & t) 						{							cerr << t.toString() << endl;						}						deleteGameServerPlayer(i);						delete pGameServerPlayer;					} 					catch (ProtocolException & cp) 					{						StringStream msg;						msg << "DISCONNECT " << pGameServerPlayer->getID() 							<< "(" << cp.toString() << ")";						//log(LOG_GAMESERVER_ERROR, "", "", cp.toString());						// 捞固 楷搬捞 辆丰登菌栏骨肺, 免仿 滚欺甫 敲矾矫秦辑绰 救等促.						try 						{							pGameServerPlayer->disconnect(DISCONNECTED);						} 						catch (Throwable & t) 						{							cerr << t.toString() << endl;						}						deleteGameServerPlayer(i);						delete pGameServerPlayer;					}				}			}		}	}	//__LEAVE_CRITICAL_SECTION(m_Mutex)	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// process all players' exceptions// 泅犁鳖瘤绰 OOB 单捞鸥甫 傈价且 拌裙篮 绝促.// 蝶扼辑, 父距 OOB啊 难廉 乐促搁 俊矾肺 埃林窍绊 立加阑 犬 漏扼 滚赴促.//////////////////////////////////////////////////////////////////////////////void GameServerManager::processExceptions () 	throw (IOException , Error){	__BEGIN_TRY	//__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 (FD_ISSET(i , &m_ExceptFDs[1])) 		{			if (i != m_SocketID) 			{				if (m_pGameServerPlayers[i] != NULL) 				{					GameServerPlayer* pGameServerPlayer = m_pGameServerPlayers[i];					Assert(pGameServerPlayer != NULL );					Assert(i != m_SocketID);					Assert(m_pGameServerPlayers[i] != NULL);					StringStream msg;					msg << "OOB from " << pGameServerPlayer->toString();					try 					{						pGameServerPlayer->disconnect();					} 					catch (Throwable & t) 					{						//cerr << t.toString() << endl;					} 					deleteGameServerPlayer(i);					delete pGameServerPlayer;				}			} 			else 			{				//cerr << "Exception in Loginserver to Gameserver" << endl;			}		}	}	//__LEAVE_CRITICAL_SECTION(m_Mutex)	__END_CATCH}	//////////////////////////////////////////////////////////////////////////////// select 扁馆俊辑绰 nonblocking 家南阑 荤侩窍瘤 臼绰促.//////////////////////////////////////////////////////////////////////////////void GameServerManager::acceptNewConnection ()	throw (Error){	__BEGIN_TRY	// 喉废欧 规侥栏肺 connection阑 扁促副 版快	// 府畔登绰 蔼篮 例措 NULL捞 瞪 荐 绝促.	// 肚茄 NonBlockingIOException档 惯积且 荐 绝促.	Socket* client = NULL;	try {		client = m_pServerSocket->accept();	} catch ( Throwable & t ) {	}	if (client == NULL) 	{		return;	}	try 	{		// 俊矾 贸府甫 困窍咯 持绢 滴菌绰单 盔牢阑 怖 灌囚具 茄促..		// 酒付档 Thread狼 家南 包府 何盒俊辑 巩力啊 积扁瘤 臼阑鳖 积阿 茄促		// Thread 包访 贸府甫 场郴扁 傈鳖瘤 烙矫肺 甸绢埃促.		if( client->getSockError() ) throw Error();		client->setNonBlocking();		// 俊矾 贸府甫 困窍咯 持绢 滴菌绰单 盔牢阑 怖 灌囚具 茄促..		// 酒付档 Thread狼 家南 包府 何盒俊辑 巩力啊 积扁瘤 臼阑鳖 积阿 茄促		// Thread 包访 贸府甫 场郴扁 傈鳖瘤 烙矫肺 甸绢埃促.		if( client->getSockError() ) throw Error();		// set socket option (!NonBlocking, NoLinger)		client->setLinger(0);		//StringStream msg;		//cout << "NEW CONNECTION FROM " << client->getHost() << ":" << client->getPort();		// 努扼捞攫飘 家南阑 颇扼固磐肺 荤侩秦辑 敲饭捞绢 按眉甫 积己茄促.		GameServerPlayer* pGameServerPlayer = new GameServerPlayer(client);		// IPM 俊 殿废茄促.		try 		{			addGameServerPlayer(pGameServerPlayer);		}		catch ( DuplicatedException& ) 		{			client->close();			SAFE_DELETE(client);			SAFE_DELETE(pGameServerPlayer);			return;		}	} 	catch (NoSuchElementException&) 	{		StringStream msg2;		msg2 << "ILLEGAL ACCESS FROM " << client->getHost() << ":" <<  client->getPort();		//log(LOG_GAMESERVER, "", "", msg2.toString());		// 牢刘登瘤 给茄 楷搬捞骨肺 楼弗促. -_-;		client->send("Error : Unauthorized access",27);		client->close();		SAFE_DELETE(client);	}	catch (Throwable & t)	{		try		{			if( client != NULL ) 			{//				client->close();				SAFE_DELETE(client);			}		}		catch (Throwable & t)		{		}		catch (...)		{		}	}	catch (exception& e)	{	}	catch (...)	{	}	__END_CATCH}////////////////////////////////////////////////////////////////////////// 货肺款 楷搬俊 包访等 敲饭捞绢 按眉甫 IPM俊 眠啊茄促.////////////////////////////////////////////////////////////////////////void GameServerManager::addGameServerPlayer(GameServerPlayer* pGameServerPlayer) 	throw (DuplicatedException , Error){	__BEGIN_TRY	__ENTER_CRITICAL_SECTION(m_Mutex)	SOCKET fd = pGameServerPlayer->getSocket()->getSOCKET();	// m_MinFD , m_MaxFD 甫 犁炼沥茄促.	m_MinFD = min(fd , m_MinFD);	m_MaxFD = max(fd , m_MaxFD);	// 葛电 fd_set 俊 fd 厚飘甫 on 矫挪促.	// m_XXXFDs[1] 篮 促澜锅俊 贸府秦林搁 等促.	FD_SET(fd , &m_ReadFDs[0]);	FD_SET(fd , &m_WriteFDs[0]);	FD_SET(fd , &m_ExceptFDs[0]);	m_pGameServerPlayers[fd] = pGameServerPlayer;	__LEAVE_CRITICAL_SECTION(m_Mutex)	__END_CATCH}////////////////////////////////////////////////////////////////////////// 漂沥 敲饭捞绢甫 IPM 俊辑 昏力茄促.////////////////////////////////////////////////////////////////////////void GameServerManager::deleteGameServerPlayer(SOCKET fd) 	throw (OutOfBoundException , NoSuchElementException , Error){	__BEGIN_TRY	__ENTER_CRITICAL_SECTION(m_Mutex)	m_pGameServerPlayers[fd] = NULL;	// m_MinFD , m_MaxFD 甫 犁炼沥茄促.	// fd == m_MinFD && fd == m_MaxFD 牢 版快绰 霉锅掳 if 俊辑 贸府等促.	if (fd == m_MinFD) 	{		// 菊俊辑何磐 力老 累篮 fd 甫 茫绰促.		// m_MinFD 磊府绰 泅犁 NULL 捞 登绢 乐澜阑 蜡狼窍扼.		int i = m_MinFD;		for (i = m_MinFD ; i <= m_MaxFD ; i ++) 		{			if (m_pGameServerPlayers[i] != NULL || i == m_SocketID) 			{				m_MinFD = i;					break;			}		}		// 利例茄 m_MinFD甫 茫瘤 给沁阑 版快,		// 捞锭俊绰 m_MinFD == m_MaxFD 牢 版快捞促.		// 捞锭俊绰 笛 促 -1 肺 汲沥秦林磊.		if (i > m_MaxFD) m_MinFD = m_MaxFD = -1;	} 	else if (fd == m_MaxFD) 	{		// 第俊辑何磐 啊厘 奴 fd 甫 茫绰促.		// SocketID 俊 蜡狼且 巴! (SocketID 狼 版快 Player 器牢磐绰 NULL 捞促.)		int i = m_MaxFD;		for (i = m_MaxFD ; i >= m_MinFD ; i --) {			if (m_pGameServerPlayers[i] != NULL || i == m_SocketID) {				m_MaxFD = i;				break;			}		}		// 利例茄 m_MinFD甫 茫瘤 给沁阑 版快,		if (i < m_MinFD) {			throw UnknownError("m_MinFD & m_MaxFD problem.");		}	}	// 葛电 fd_set 俊 fd 厚飘甫 off 矫挪促.	// m_XXXFDs[1]档 绊媚具 窍绰 捞蜡绰, 捞饶 贸府俊辑 按眉啊 绝绢脸绰单档	// 贸府罐阑 犬伏捞 乐扁 锭巩捞促.	FD_CLR(fd , &m_ReadFDs[0]);	FD_CLR(fd , &m_ReadFDs[1]);	FD_CLR(fd , &m_WriteFDs[0]);	FD_CLR(fd , &m_WriteFDs[1]);	FD_CLR(fd , &m_ExceptFDs[0]);	FD_CLR(fd , &m_ExceptFDs[1]);	__LEAVE_CRITICAL_SECTION(m_Mutex)	__END_CATCH}void GameServerManager::heartbeat()	throw(Error) {	__BEGIN_TRY	__ENTER_CRITICAL_SECTION(m_Mutex)	__LEAVE_CRITICAL_SECTION(m_Mutex)		__END_CATCH}// external variable definitionGameServerManager* g_pGameServerManager = NULL;

⌨️ 快捷键说明

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