📄 loginplayermanager.cpp
字号:
////////////////////////////////////////////////////////////////////////// Filename : LoginPlayerManager.cpp// Written by : reiot@ewestsoft.com// Description : 肺弊牢 辑滚侩 努扼捞攫飘 概聪历////////////////////////////////////////////////////////////////////////// include files#include <stdio.h>#include "LoginPlayerManager.h"#include "Assert.h"#include "SocketAPI.h"#include "Socket.h"#include "LoginPlayer.h"#include "LogClient.h"#include <algorithm>#include "Properties.h"#include "ReconnectLoginInfoManager.h"#include "gameserver/billing/BillingInfo.h"#include "DB.h"////////////////////////////////////////////////////////////////////////// constructor//// 窍困 概聪历 按眉甫 积己窍绰 镑捞促. (弊繁单, 绝促. - -;)////////////////////////////////////////////////////////////////////////LoginPlayerManager::LoginPlayerManager () throw ( Error ): m_pServerSocket(NULL), m_ServerFD(INVALID_SOCKET), m_MinFD(-1), m_MaxFD(-1){ __BEGIN_TRY m_Mutex.setName("LoginPlayerManager"); g_pReconnectLoginInfoManager = new ReconnectLoginInfoManager(); __END_CATCH}////////////////////////////////////////////////////////////////////////// destructor//// 窍困 概聪历 按眉甫 昏力窍绰 镑捞促. (弊繁单, 绝促. - -;)////////////////////////////////////////////////////////////////////////LoginPlayerManager::~LoginPlayerManager () throw ( Error ){ __BEGIN_TRY if ( m_pServerSocket != NULL ) { m_pServerSocket->close(); delete m_pServerSocket; m_pServerSocket = NULL; } // base class牢 PlayerManager狼 destructor俊辑 立加茄 葛电 敲饭捞绢甸狼 // 楷搬阑 谗绊, 按眉甫 昏力窍骨肺 脚版静瘤 臼酒档 等促. // if ( g_pReconnectLoginInfoManager!= NULL ) { delete g_pReconnectLoginInfoManager; g_pReconnectLoginInfoManager = NULL; } __END_CATCH}////////////////////////////////////////////////////////////////////////// 窍困 概聪历 按眉甫 檬扁拳窍绊, 磊脚阑 檬扁拳茄促.////////////////////////////////////////////////////////////////////////void LoginPlayerManager::init () throw ( Error ){ __BEGIN_TRY // 辑滚 家南阑 积己茄促. try { m_pServerSocket = new ServerSocket( g_pConfig->getPropertyInt("LoginServerPort") ); } catch ( BindException & be ) { throw Error( be.toString() ); } // 辑滚 家南 叼胶农赋磐甫 瘤沥茄促. m_ServerFD = m_pServerSocket->getSOCKET(); // fd_set 甸阑 0 栏肺 檬扁拳茄促. FD_ZERO( &m_ReadFDs[0] ); FD_ZERO( &m_WriteFDs[0] ); FD_ZERO( &m_ExceptFDs[0] ); // 辑滚 家南阑 囊促. FD_SET( m_ServerFD , &m_ReadFDs[0] ); // set min/max fd m_MaxFD = m_MinFD = m_ServerFD; // m_Timeout 阑 檬扁拳茄促. // 唱吝俊绰 捞 林扁 开矫 可记栏肺 贸府窍档废 窍磊. // ZonePlayerManager俊 厚秦辑 辨绢档 公规窍促..... m_Timeout[0].tv_sec = 0; m_Timeout[0].tv_usec = 0; //-------------------------------------------------------------------------------- // Player.LogOn 甫 沥府秦霖促. //-------------------------------------------------------------------------------- Statement* pStmt = NULL; Statement* pStmt2 = NULL; try { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt2 = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); Result* pResult = pStmt->executeQuery("SELECT PlayerID from Player WHERE LogOn = 'LOGON' AND CurrentLoginServerID=%d", g_pConfig->getPropertyInt("LoginServerID")); // 白规俊辑 愁带局甸 沥府秦霖促. // 呼傅~ by sigi 2002.5.31 while (pResult->next()) { string playerID = pResult->getString(1); //cout << "delete from PCRoomUserInfo " << playerID.c_str() << endl; pStmt2->executeQuery( "DELETE FROM PCRoomUserInfo WHERE PlayerID='%s'", playerID.c_str()); //cout << "delete ok" << endl; } pStmt->executeQuery("UPDATE Player SET LogOn = 'LOGOFF' WHERE LogOn = 'LOGON' AND CurrentLoginServerID=%d", g_pConfig->getPropertyInt("LoginServerID")); SAFE_DELETE(pStmt); SAFE_DELETE(pStmt2); } catch ( SQLQueryException & sqe ) { SAFE_DELETE(pStmt); SAFE_DELETE(pStmt2); throw Error(sqe.toString()); } __END_CATCH}//////////////////////////////////////////////////////////////////////// select()甫 荤侩秦辑 I/O Multiplexing 阑 茄促.//////////////////////////////////////////////////////////////////////void LoginPlayerManager::select () throw ( 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 ( TimeoutException ) { // do nothing } catch ( InterruptedException & ie ) { // 矫弊澄捞 棵 府啊 决骂~~ log(LOG_LOGINSERVER, "", "", ie.toString()); } __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH}//////////////////////////////////////////////////////////////////////// 趣矫葛甫 OOB 单捞鸥甫 贸府茄促.//////////////////////////////////////////////////////////////////////void LoginPlayerManager::processExceptions () throw ( Error ){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) for ( int i = m_MinFD ; i <= m_MaxFD ; i ++ ) { if ( FD_ISSET( i , &m_ExceptFDs[1] ) && i != m_ServerFD ) { Assert( m_pPlayers[i] != NULL ); StringStream msg; msg << "OOB from " << m_pPlayers[i]->toString(); log(LOG_LOGINSERVER_ERROR, "", "", msg.toString()); cout << msg.toString() << endl; // 免仿 滚欺甫 敲矾矫茄促. m_pPlayers[i]->disconnect(UNDISCONNECTED); // 敲饭捞绢 按眉甫 昏力茄促. delete m_pPlayers[i]; // 敲饭捞绢 概聪历俊辑 敲饭捞绢甫 昏力茄促. deletePlayer_NOLOCKED( i ); } } __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH}//////////////////////////////////////////////////////////////////////// 立加茄 葛电 敲饭捞绢甸狼 涝仿阑 阿磊狼 涝仿 滚欺俊 汗荤茄促.//////////////////////////////////////////////////////////////////////void LoginPlayerManager::processInputs () throw ( Error ){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) for ( int i = m_MinFD ; i <= m_MaxFD ; i ++ ) { if ( FD_ISSET( i , &m_ReadFDs[1] ) ) { if ( i == m_ServerFD ) { // 辑滚 家南老 版快, 货肺款 立加捞 甸绢吭促绰 舵捞促. acceptNewConnection(); } else { Assert( m_pPlayers[i] != NULL ); try { if (m_pPlayers[i]->getSocket()->getSockError()) { // 捞固 楷搬捞 谗变 惑怕捞骨肺, 免仿 滚欺甫 敲矾矫窍瘤 臼酒具 茄促. m_pPlayers[i]->disconnect(DISCONNECTED); // 敲饭捞绢 按眉甫 昏力茄促. delete m_pPlayers[i]; // 敲饭捞绢 概聪历俊辑 敲饭捞绢甫 昏力茄促. deletePlayer_NOLOCKED( i ); } else { m_pPlayers[i]->processInput(); } } catch ( ConnectException & ce ) { // Blocking 家南捞骨肺 ConnectException 苞 Error甫 力寇茄 绢恫 抗寇档 惯积窍瘤 臼绰促. cout << ce.toString() << endl; log(LOG_LOGINSERVER_ERROR, "", ce.toString()); // 捞固 楷搬捞 谗变 惑怕捞骨肺, 免仿 滚欺甫 敲矾矫窍瘤 臼酒具 茄促. m_pPlayers[i]->disconnect(DISCONNECTED); // 敲饭捞绢 按眉甫 昏力茄促. delete m_pPlayers[i]; // 敲饭捞绢 概聪历俊辑 敲饭捞绢甫 昏力茄促. deletePlayer_NOLOCKED( i ); } } } } __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH}//////////////////////////////////////////////////////////////////////// 立加茄 葛电 敲饭捞绢甸狼 涝仿 菩哦阑 贸府茄促.//////////////////////////////////////////////////////////////////////void LoginPlayerManager::processCommands () throw ( Error ){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) // m_pPlayers[i] != NULL 狼 犬伏捞 i != m_ServerFD 焊促 臭栏骨肺 // 捞 炼扒阑 菊俊促啊 敌促. for ( int i = m_MinFD ; i <= m_MaxFD ; i ++ ) { if ( m_pPlayers[i] != NULL && i != m_ServerFD ) { try {#ifdef __CONNECT_BILLING_SYSTEM__ //LoginPlayer* pLoginPlayer = dynamic_cast<LoginPlayer*>(m_pPlayers[i]); // 酒流 呼傅 矫胶袍俊辑 八刘登瘤 臼疽促搁.. // 茄锅父 焊郴绊 霸扁绰 吧肺 荐沥. 局靛呼(冠沥荐) 夸没. by bezz. 2003.04.21 //if (!pLoginPlayer->isBillingLoginVerified()) //{ //pLoginPlayer->sendBillingLogin(); //}#endif m_pPlayers[i]->processCommand(); } catch ( ProtocolException & pe ) { //-------------------------------------------------- // ProtocolException狼 辆幅俊绰 3 啊瘤啊 乐促. // // - InvalidProtocolException : 橇肺配妮 俊矾 // - DisconnectException : 楷搬阑 辆丰矫糯 // - InsufficiendDataException : 菩哦捞 何盒利栏肺父 档馒沁澜 // // 捞 葛滴 努扼捞攫飘客狼 楷搬捞 瘤加登绢 乐绰 惑怕 // 捞骨肺, disconnect矫 UNDISCONNECTED 颇扼固磐甫 荤侩秦辑 // 免仿 滚欺甫 敲矾矫秦拎具 茄促. // //-------------------------------------------------- cout << pe.toString() << endl; log(LOG_LOGINSERVER_ERROR, "", "", pe.toString()); m_pPlayers[i]->disconnect(UNDISCONNECTED); // 敲饭捞绢 按眉甫 昏力茄促. delete m_pPlayers[i]; // 敲饭捞绢 概聪历俊辑 敲饭捞绢甫 昏力茄促. deletePlayer_NOLOCKED(i); } // 辫己刮俊 狼秦 眠啊... 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); } } } __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH}//////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -