📄 gameservermanager.cpp
字号:
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 + -