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

📄 loginplayermanager.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 立加茄 葛电 敲饭捞绢甸狼 免仿阑 努扼捞攫飘肺 傈价茄促.//////////////////////////////////////////////////////////////////////void LoginPlayerManager::processOutputs ()	throw ( Error ){	__BEGIN_TRY	__ENTER_CRITICAL_SECTION(m_Mutex)	for ( int i = m_MinFD ; i <= m_MaxFD ; i ++ ) {		if ( FD_ISSET( i , &m_WriteFDs[1] ) && i != m_ServerFD ) {			Assert( m_pPlayers[i] != NULL );			try {				m_pPlayers[i]->processOutput();			} catch ( ConnectException & ce ) {					cout << ce.toString() << endl;				log(LOG_LOGINSERVER_ERROR, "", "", ce.toString());				// 捞固 楷搬捞 谗变 惑怕捞骨肺, 免仿 滚欺甫 敲矾矫窍瘤 臼酒具 茄促.				m_pPlayers[i]->disconnect(DISCONNECTED);				// 敲饭捞绢 按眉甫 昏力茄促.				delete m_pPlayers[i];					// 敲饭捞绢 概聪历俊辑 敲饭捞绢甫 昏力茄促.				deletePlayer_NOLOCKED( i );			} catch ( ProtocolException & pe ) {				cout << pe.toString() << endl;				log(LOG_LOGINSERVER_ERROR, "", "", pe.toString());				// 捞固 楷搬捞 谗变 惑怕捞骨肺, 免仿 滚欺甫 敲矾矫窍瘤 臼酒具 茄促.				m_pPlayers[i]->disconnect(DISCONNECTED);				// 敲饭捞绢 按眉甫 昏力茄促.				delete m_pPlayers[i];					// 敲饭捞绢 概聪历俊辑 敲饭捞绢甫 昏力茄促.				deletePlayer_NOLOCKED( i );			}		}	}	__LEAVE_CRITICAL_SECTION(m_Mutex)	__END_CATCH}	////////////////////////////////////////////////////////////////////////// accept new connection//// select 扁馆俊辑绰 nonblocking 家南阑 荤侩窍瘤 臼绰促.//// 肺弊牢 辑滚绰 扁夯利栏肺 葛电 楷搬矫档甫 罐酒甸牢促. // 窜 BAN DB俊 殿废等 IP肺何磐狼 楷搬篮 罐酒甸捞瘤 臼绰促.////////////////////////////////////////////////////////////////////////void LoginPlayerManager::acceptNewConnection ()	throw ( Error ){	__BEGIN_TRY	// 喉废欧 规侥栏肺 connection阑 扁促副 版快	// 府畔登绰 蔼篮 例措 NULL捞 瞪 荐 绝促.	// 肚茄 NonBlockingIOException档 惯积且 荐 绝促.	Socket * client = NULL;		try {		client = m_pServerSocket->accept();	} catch (Throwable& t) {	}			// ConnectException 捞 惯积且 啊瓷己捞 乐促. (角力肺 惯积沁促.)		// 泅犁 郴何俊辑 CE 啊 惯货且 版快, NULL 阑 府畔窍扁 锭巩俊..	// NULL 阑 眉农秦辑, 公矫秦拎具 茄促.	if ( client == NULL )		return;			if (client->getSockError())	{		delete client;		return;	}	client->setNonBlocking();	if (client->getSockError())	{		delete client;		return;	}	StringStream msg;	msg << "NEW CONNECTION FROM [" << client->getHost().c_str() << ":" << client->getPort() << "]";	log(LOG_LOGINSERVER, "", "", msg.toString());	//cout << "NEW CONNECTION FROM " << client->getHost() << ":" << client->getPort() << endl;	//--------------------------------------------------	// BAN DB俊 孽府秦辑 泅犁 IP啊 棵官弗瘤 犬牢秦夯促.	//--------------------------------------------------	/*	if ( g_pBanManager->isBanned( client->getHost() ) ) {		client->send("You are banned. Bye~\n",23);		client->close();		delete client;	}	*/	// set socket option ( !NonBlocking, NoLinger )	client->setLinger(0);			// 努扼捞攫飘 家南阑 颇扼固磐肺 荤侩秦辑 敲饭捞绢 按眉甫 积己茄促.	LoginPlayer * pPlayer = new LoginPlayer( client );	// set player status to PLAYER_LOGON	Assert( pPlayer->getPlayerStatus() == LPS_NONE );	pPlayer->setPlayerStatus( LPS_BEGIN_SESSION );			// LoginPlayerManager俊 殿废茄促.	addPlayer_NOLOCKED(pPlayer);					__END_CATCH}////////////////////////////////////////////////////////////////////////// 漂沥 敲饭捞绢甫 概聪历俊 眠啊茄促.//// 肺弊牢 辑滚俊辑绰 敲饭捞绢 硅凯俊 措秦辑 蝶肺 静饭靛啊 倒瘤 臼栏骨肺// locking 阑 且 鞘夸啊 绝促.////////////////////////////////////////////////////////////////////////void LoginPlayerManager::addPlayer_NOLOCKED ( Player * pPlayer ) 	throw ( DuplicatedException , Error ){	__BEGIN_TRY	PlayerManager::addPlayer(pPlayer);	SOCKET fd = pPlayer->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] );	__END_CATCH}//--------------------------------------------------------------------------------//--------------------------------------------------------------------------------void LoginPlayerManager::addPlayer ( Player * pPlayer ) 	throw ( DuplicatedException , Error ){	__ENTER_CRITICAL_SECTION(m_Mutex)		addPlayer_NOLOCKED(pPlayer);	__LEAVE_CRITICAL_SECTION(m_Mutex)}//--------------------------------------------------------------------------------//// 漂沥 敲饭捞绢甫 概聪历俊辑 昏力茄促.//// 肺弊牢 辑滚俊辑绰 敲饭捞绢 硅凯俊 措秦辑 蝶肺 静饭靛啊 倒瘤 臼栏骨肺// locking 阑 且 鞘夸啊 绝促.////--------------------------------------------------------------------------------void LoginPlayerManager::deletePlayer_NOLOCKED ( SOCKET fd ) 	throw ( OutOfBoundException , NoSuchElementException , Error ){	__BEGIN_TRY	PlayerManager::deletePlayer(fd);	Assert( m_pPlayers[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_MaxFD ; i ++ ) {			if ( m_pPlayers[i] != NULL || i == m_ServerFD ) {				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 甫 茫绰促.		// ServerFD 俊 蜡狼且 巴! ( ServerFD 狼 版快 Player 器牢磐绰 NULL 捞促. )		int i = m_MaxFD;		for ( ; i >= m_MinFD ; i -- ) {			if ( m_pPlayers[i] != NULL || i == m_ServerFD ) {				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] );	__END_CATCH}//--------------------------------------------------------------------------------//--------------------------------------------------------------------------------void LoginPlayerManager::deletePlayer ( SOCKET fd ) 	throw ( OutOfBoundException , NoSuchElementException , Error ){	__ENTER_CRITICAL_SECTION(m_Mutex)		deletePlayer_NOLOCKED(fd);	__LEAVE_CRITICAL_SECTION(m_Mutex)}//----------------------------------------------------------------------// 肺弊牢 辑滚俊 立加茄 漂沥 敲饭捞绢甫 八祸茄促.//----------------------------------------------------------------------LoginPlayer * LoginPlayerManager::getPlayer_NOLOCKED ( const string & id ) const	throw ( NoSuchElementException , Error ){	__BEGIN_TRY	LoginPlayer * pLoginPlayer = NULL;	//cout << "m_MinFD : " << m_MinFD << endl;	//cout << "m_MaxFD : " << m_MaxFD << endl;	for ( int i = m_MinFD ; i <= m_MaxFD ; i ++ ) 	{		if ( m_pPlayers[i] != NULL ) 		{			//cout << "[" << i << "] : " << m_pPlayers[i]->toString() << endl;			//cout << "[" << i << "] : " << m_pPlayers[i]->getID().c_str() << endl;			if ( m_pPlayers[i]->getID() == id ) 			{				pLoginPlayer = dynamic_cast<LoginPlayer*>(m_pPlayers[i]);				//cout << "Found OK" << endl;				break;			}		}	}	if ( pLoginPlayer == NULL ) throw NoSuchElementException("弊繁 酒捞叼甫 啊柳 敲饭捞绢绰 粮犁窍瘤 臼嚼聪促.");	return pLoginPlayer;	__END_CATCH}//--------------------------------------------------------------------------------//--------------------------------------------------------------------------------LoginPlayer * LoginPlayerManager::getPlayer ( const string & id ) const	throw ( NoSuchElementException , Error ){	LoginPlayer * pPlayer;	__ENTER_CRITICAL_SECTION(m_Mutex)	pPlayer = getPlayer_NOLOCKED(id);	__LEAVE_CRITICAL_SECTION(m_Mutex)	return pPlayer;}//--------------------------------------------------------------------------------// 肺弊牢 辑滚俊 立加茄 葛电 敲饭捞绢甸俊霸 漂沥 菩哦阑 傈价茄促.//--------------------------------------------------------------------------------void LoginPlayerManager::broadcastPacket ( Packet * pPacket )	throw ( Error ){	__BEGIN_TRY	for ( int i = m_MinFD ; i <= m_MaxFD ; i ++ ) {		if ( m_pPlayers[i] != NULL ) {			m_pPlayers[i]->sendPacket(pPacket);		}	}	__END_CATCH}//--------------------------------------------------------------------------------// 肺弊牢 辑滚俊 立加茄 漂沥 敲饭捞绢俊霸 漂沥 菩哦阑 焊辰促.//--------------------------------------------------------------------------------void LoginPlayerManager::sendPacket ( const string & id , Packet * pPacket )	throw ( Error ){	__BEGIN_TRY	for ( int i = m_MinFD ; i <= m_MaxFD ; i ++ ) 	{		if ( m_pPlayers[i] != NULL ) 		{			//cout << "[" << i << "] ID : " << m_pPlayers[i]->getID() << endl;			if ( m_pPlayers[i]->getID() == id ) 			{				m_pPlayers[i]->sendPacket(pPacket);				break;			}		}	}	__END_CATCH}//////////////////////////////////////////////////////////////////////// get debug string//////////////////////////////////////////////////////////////////////string LoginPlayerManager::toString () const	throw (){	__BEGIN_TRY	StringStream msg;	msg << "LoginPlayerManager(nPlayers:" << size() << ")";	return msg.toString();	__END_CATCH}// global variable definitionLoginPlayerManager * g_pLoginPlayerManager = NULL;

⌨️ 快捷键说明

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