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

📄 incomingplayermanager.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//////////////////////////////////////////////////////////////////////////////// Filename    : IncomingPlayerManager.cpp// Written by  : reiot@ewestsoft.com// Description : //////////////////////////////////////////////////////////////////////////////#include <stdio.h>#include "IncomingPlayerManager.h"#include "Assert.h"#include "SocketAPI.h"#include "Socket.h"#include "Player.h"#include <algorithm>#include "Properties.h"#include "GamePlayer.h"#include "LoginServerManager.h"#include "PacketUtil.h"#include "ZoneInfoManager.h"#include "ZoneGroup.h"#include "ZonePlayerManager.h"#include "DB.h"#include "LogClient.h"#include "PaySystem.h"#include "MasterLairManager.h"#include "Encrypter.h"#include "LogDef.h"#include "PlayerCreature.h"#include "PKZoneInfoManager.h"#include "CreatureUtil.h"#include "Gpackets/GCUpdateInfo.h"#include "Gpackets/GLIncomingConnection.h"#include "Gpackets/GLKickVerify.h"#include "UserGateway.h"#include "SystemAvailabilitiesManager.h"//////////////////////////////////////////////////////////////////////////////// constructor// 窍困 概聪历 棺 单捞鸥 糕滚甸阑 积己茄促.//////////////////////////////////////////////////////////////////////////////IncomingPlayerManager::IncomingPlayerManager () 	throw (Error): m_pServerSocket(NULL), m_SocketID(INVALID_SOCKET), m_MinFD(-1), m_MaxFD(-1){	__BEGIN_TRY	m_Mutex.setName("IncomingPlayerManager");	m_MutexOut.setName("IncomingPlayerManagerOut");	m_PlayerListQueue.clear();	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());	}	g_pConnectionInfoManager = new ConnectionInfoManager();	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// destructor//////////////////////////////////////////////////////////////////////////////IncomingPlayerManager::~IncomingPlayerManager () 	throw (Error){	__BEGIN_TRY	SAFE_DELETE(g_pConnectionInfoManager);	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// 窍困 概聪历 棺 单捞磐 糕滚甫 檬扁拳茄促.//////////////////////////////////////////////////////////////////////////////void IncomingPlayerManager::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 阑 檬扁拳茄促.	// 唱吝俊绰 捞 林扁 开矫 可记栏肺 贸府窍档废 窍磊.	// ZonePlayerManager俊 厚秦辑 辨绢档 公规窍促.....	m_Timeout[0].tv_sec = 0;	m_Timeout[0].tv_usec = 0;	/*	// connection info manager 甫 檬扁拳茄促.	// 盔贰绰 肺弊牢辑滚肺何磐 罐酒具 窍瘤父..	// 老窜 210.220.188.161 ~ 180 鳖瘤 殿废秦敌促.	char buf[20];	for (int i = 0 ; i < 20 ; i ++) 	{		sprintf(buf,"210.220.188.%d",161+i);		ConnectionInfo* pConnectionInfo = new ConnectionInfo();		pConnectionInfo->setClientIP(buf);		g_pConnectionInfoManager.addConnectionInfo(pConnectionInfo);	}	*/	string dist_host     = g_pConfig->getProperty("UI_DB_HOST");	string dist_db       = "DARKEDEN";	string dist_user     = g_pConfig->getProperty("UI_DB_USER");	string dist_password = g_pConfig->getProperty("UI_DB_PASSWORD");	Connection* pDistConnection = new Connection(dist_host, dist_db, dist_user, dist_password);	g_pDatabaseManager->addDistConnection(((int)Thread::self()), pDistConnection);	cout << "******************************************************" << endl;	cout << " THREAD CONNECT UIIRIBUTION DB " << endl;	cout << " TID Number = " << (int)Thread::self()<< endl;	cout << "******************************************************" << endl;	/*    // Login DB 狼 PCRoomDBInfo Table 佬绢辑 Connection 父甸扁    pStmt = pDistConnection->createStatement();    Result * pResult = NULL;    pResult = pStmt->executeQuery("SELECT ID, Host, DB, User, Password FROM PCRoomDBInfo");    if (pResult->next())    {        WorldID_t ID = pResult->getInt(1);        string host = pResult->getString(2);        string db = pResult->getString(3);        string user = pResult->getString(4);        string password = pResult->getString(5);        cout << "Connection: "             << "  ID=" << (int)ID             << ", HOST=" << host.c_str()             << ", DB=" << db.c_str()             << ", User=" << user.c_str() << endl;        Connection * pConnection = new Connection(host, db, user, password);        Assert(pConnection!=NULL);        g_pDatabaseManager->addPCRoomConnection((int)(Thread::self()) , pConnection );    }	*/	// Player.LogOn 甫 沥府秦霖促.    Statement * pStmt = NULL;	Statement* pStmt2 = NULL;	BEGIN_DB	{		//pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement();		//pStmt = g_pDatabaseManager->getDistConnection( (int)Thread::self() )->createStatement();		//pStmt2 = g_pDatabaseManager->getDistConnection( (int)Thread::self() )->createStatement();		pStmt = g_pDatabaseManager->getDistConnection( "PLAYER_DB" )->createStatement();		pStmt2 = g_pDatabaseManager->getDistConnection( "PLAYER_DB" )->createStatement();		Result* pResult = pStmt->executeQuery("SELECT PlayerID from Player WHERE LogOn='GAME' AND CurrentWorldID=%d AND CurrentServerGroupID=%d",													g_pConfig->getPropertyInt("WorldID"), g_pConfig->getPropertyInt("ServerID") );		// 白规俊辑 愁带局甸 沥府秦霖促.		// 呼傅~ by sigi 2002.5.31 		while (pResult->next())		{			string playerID = pResult->getString(1);			pStmt2->executeQuery( "DELETE FROM PCRoomUserInfo WHERE PlayerID='%s'",						                    playerID.c_str());		}		pStmt->executeQuery("UPDATE Player SET LogOn = 'LOGOFF' WHERE LogOn = 'GAME' AND CurrentWorldID=%d AND CurrentServerGroupID=%d",			g_pConfig->getPropertyInt("WorldID"), g_pConfig->getPropertyInt("ServerID") );		/*		// 滴锅 窍绰芭 力芭. by sigi. 2002.5.9		pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement();		pStmt->executeQuery("DELETE FROM UserIPInfo WHERE ServerID = %d", g_pConfig->getPropertyInt("ServerID") );		*/		SAFE_DELETE(pStmt);		SAFE_DELETE(pStmt2);	}	END_DB(pStmt)	BEGIN_DB	{		pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement();		pStmt->executeQuery("DELETE FROM UserIPInfo WHERE ServerID = %d", g_pConfig->getPropertyInt("ServerID") );		SAFE_DELETE(pStmt);	}	END_DB(pStmt)	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void IncomingPlayerManager::copyPlayers()	    throw(){	__BEGIN_TRY	__ENTER_CRITICAL_SECTION(m_Mutex)	PlayerManager::copyPlayers();	__LEAVE_CRITICAL_SECTION(m_Mutex)	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void IncomingPlayerManager::broadcast (Packet* pPacket)	throw (Error){	__BEGIN_TRY	__ENTER_CRITICAL_SECTION(m_Mutex)	for (int i = m_MinFD ; i <= m_MaxFD ; i ++) {		if (i != m_SocketID && m_pPlayers[i] != NULL)			m_pPlayers[i]->sendPacket(pPacket);	}    __LEAVE_CRITICAL_SECTION(m_Mutex)	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// call select() system call// 惑困俊辑 TimeoutException 阑 罐栏搁 敲饭捞绢绰 贸府窍瘤 臼酒档 等促.//////////////////////////////////////////////////////////////////////////////void IncomingPlayerManager::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]);	} 	/*	// 林籍贸府 by sigi. 2002.5.14	catch (TimeoutException&) 	{		// do nothing	} 	*/	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 IncomingPlayerManager::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;	}	//copyPlayers();	for (int i = m_MinFD ; i <= m_MaxFD ; i ++) 	{		if (FD_ISSET(i , &m_ReadFDs[1])) 		{			if (i == m_SocketID) 			{				//  辑滚 家南老 版快 货肺款 楷搬捞 档馒沁促绰 舵捞促.				// by sigi. 2002.12.8				for (int i=0; i<50; i++)	// 50疙父 罐磊 - -;				{					if (!acceptNewConnection())						break;				}			} 			else 			{				if (m_pPlayers[i] != NULL) 				{					GamePlayer* pTempPlayer = dynamic_cast<GamePlayer*>(m_pPlayers[i]);					Assert(pTempPlayer != NULL);					Assert(m_pPlayers[i] != NULL);					if (pTempPlayer->getSocket()->getSockError()) 					{						FILELOG_INCOMING_CONNECTION( "ICMPISocketErr.log", "[Input] PlayerID : %s, PlayerStatus : %d", pTempPlayer->getID().c_str(), (int)pTempPlayer->getPlayerStatus() );						try 						{							// 捞固 楷搬捞 辆丰登菌栏骨肺, 免仿 滚欺甫 敲矾矫秦辑绰 救等促.							pTempPlayer->disconnect(DISCONNECTED);						} 						catch (Throwable & t) 						{							cerr << t.toString() << endl;						}						// by sigi. 2002.12.30						UserGateway::getInstance()->passUser( UserGateway::USER_OUT_INCOMING_INPUT_ERROR );						// 敲饭捞绢啊 绝促绰 富篮? 促弗 镑俊辑 瘤况 脸芭唱,						// 促弗 镑俊辑 deletePlayer甫 窍绰 镑篮 绝促.						// 坷肺瘤 阿 PlayerManager俊辑父 Player甫 瘤匡 荐 乐促.						// ProcessCommand俊辑 荤扼脸促绰 富捞促.						deletePlayer(i);						deleteQueuePlayer(pTempPlayer);						Creature* pCreature = pTempPlayer->getCreature();						if ( pCreature != NULL )							pCreature->setValue(1);						SAFE_DELETE(pTempPlayer);					} 					else 					{						try 						{							pTempPlayer->processInput();						} 						catch (ConnectException & ce) 						{							FILELOG_INCOMING_CONNECTION( "ICMPIConectionErr.log", "[Input] %s, PlayerID : %s, PlayerStatus : %d", ce.toString().c_str(), pTempPlayer->getID().c_str(), (int)pTempPlayer->getPlayerStatus() );							// Blocking 家南捞骨肺, ConnectException苞 Error甫 力寇茄 绢恫 抗寇档 惯积窍瘤 臼绰促.							// 楷搬捞 谗板阑 版快, 肺弊窍绊 敲饭捞绢 沥焊甫 历厘茄 饶俊 (肺靛登菌促搁)							// 敲饭捞绢 按眉甫 昏力茄促.							try 							{								pTempPlayer->disconnect();							} 							catch (Throwable & t) 							{								cerr << t.toString() << endl;							}							// by sigi. 2002.12.30							UserGateway::getInstance()->passUser( UserGateway::USER_OUT_INCOMING_INPUT_DISCONNECT );							// 敲饭捞绢啊 绝促绰 富篮? 促弗 镑俊辑 瘤况 脸芭唱,							// 促弗 镑俊辑 deletePlayer甫 窍绰 镑篮 绝促.							// 坷肺瘤 阿 PlayerManager俊辑父 Player甫 瘤匡 荐 乐促.							// ProcessCommand俊辑 荤扼脸促绰 富捞促.							deletePlayer(i);							deleteQueuePlayer(pTempPlayer);							Creature* pCreature = pTempPlayer->getCreature();							if ( pCreature != NULL )								pCreature->setValue(2);							SAFE_DELETE(pTempPlayer);						}					} // else				} // else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -