📄 loginplayermanager.cpp
字号:
// 立加茄 葛电 敲饭捞绢甸狼 免仿阑 努扼捞攫飘肺 傈价茄促.//////////////////////////////////////////////////////////////////////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 + -