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