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

📄 loginplayermanager.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 2 页
字号:
////////////////////////////////////////////////////////////////////////// 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 + -