updateserverplayer.cpp

来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 415 行

CPP
415
字号
//--------------------------------------------------------------------------------// // Filename    : UpdateServerPlyaer.cpp // Written By  : Reiot// //--------------------------------------------------------------------------------// include files#include "UpdateServerPlayer.h"#include "Assert.h"#include "Packet.h"#include "Upackets/CUBeginUpdate.h"#include "Upackets/CURequest.h"#include "Upackets/CUEndUpdate.h"//--------------------------------------------------------------------------------//// constructor//// *CAUTION*//// 诀单捞飘 辑滚侩 敲饭捞绢绰 颇老狼 郴侩阑 努扼捞攫飘肺 傈价窍扁 锭巩俊, 扁粮狼 // 敲饭捞绢 努贰胶俊辑 家南免仿胶飘覆苞 包访等 何盒父阑 犁沥狼秦林搁 等促. 恐衬窍搁, // 颇老狼 农扁甫 舅 荐 绝绰 惑怕俊辑 免仿阑 滚欺傅窍霸 登搁 巩力啊 积辨 家瘤啊 乐扁 // 锭巩捞促. 蝶扼辑, 滚欺傅窍瘤 臼绰 免仿 规过阑 葛祸秦具 窍摆促. 窜 涝仿 何盒篮 // 捞傈苞 鞍捞 滚欺傅阑 秦档 公规窍促. //// 积己且锭, 促弗 敲饭捞绢 窍困 努贰胶客绰 崔府, Player 努贰胶狼 积己磊甫 疙矫利栏肺// 龋免窍瘤 臼绰促. 捞绰 SocketOutputStream 捞 积己登瘤 臼绰 Player狼 叼弃飘 积己磊甫// 龋免窍档废 窍扁 困秦辑捞促. ////--------------------------------------------------------------------------------//static int maxIdleSec         = 60 * 5;      // 5盒.static int maxIdleSec         = 30; // 20檬// Http 规侥栏肺 官插扁 锭巩俊 歹 捞惑 buffer绰 腹捞 鞘夸窍瘤 臼促.// 趣矫扼档 SocketInputStream捞 resize 登绰瘤绰 犬捞秦 毫具摆瘤.// by sigi. 2002.11.11const int clientBufferSize = 1024;	UpdateServerPlayer::UpdateServerPlayer ( Socket * pSocket )	 throw ( Error )//: m_pSocket(pSocket), m_PlayerStatus(USPS_NONE): m_PlayerStatus(USPS_NONE){	__BEGIN_TRY	m_pSocket = pSocket;	getCurrentTime(m_ExpireTime);	m_ExpireTime.tv_sec += maxIdleSec;	Assert( m_pInputStream == NULL );	Assert( m_pOutputStream == NULL );	try {		// 家南涝仿胶飘覆篮 弊措肺 积己秦霖促.		m_pInputStream = new SocketInputStream( m_pSocket, clientBufferSize );	} catch (Error& t) {		filelog("updateServerPlayerBUG.txt", "%s", t.toString().c_str());		throw;	} catch (Throwable& t) {		filelog("updateServerPlayerBUG.txt", "%s", t.toString().c_str());	}	__END_CATCH}//--------------------------------------------------------------------------------//// destructor////--------------------------------------------------------------------------------UpdateServerPlayer::~UpdateServerPlayer ()	 throw ( Error ){	__BEGIN_TRY			// 弊 绢恫 敲饭捞绢 按眉啊 昏力瞪 锭俊档, 弊 惑怕绰 肺弊酒眶捞绢具 茄促.	// 溜 绢恫 敲饭捞绢甫 立加 辆丰 矫虐妨搁, 弊 惑怕甫 肺弊酒眶栏肺 父甸绢具 茄促.	Assert( m_PlayerStatus == USPS_END_SESSION );	__END_CATCH}//--------------------------------------------------------------------------------//// parse packet and execute handler for the packet//// 菩哦蒲配府甫 荤侩窍瘤 臼绰 捞蜡绰 鞘夸绝扁 锭巩捞促. -_-;////--------------------------------------------------------------------------------void UpdateServerPlayer::processCommand ()      throw ( IOException , Error ){	__BEGIN_TRY	//__BEGIN_DEBUG	bool bLog = false;	/*	if (getSocket()->getHost()=="211.208.59.138"		|| getSocket()->getHost()=="202.30.110.120")	{		bLog = true;	}	*/	//try {		// 庆歹甫 烙矫历厘且 滚欺 积己		char header[szPacketHeader];		PacketID_t packetID;		PacketSize_t packetSize;		if (isPenaltyFlag(PENALTY_TYPE_KICKED)) {			throw DisconnectException("He is had penalty");		}		//--------------------------------------------------------------------------------		// UpdateServerPlayer 狼 家南篮 blocking socket 捞扼绰 痢俊 蜡狼且 巴!		//--------------------------------------------------------------------------------		bool bInsufficientData = false;		while ( true ) {			m_pInputStream->peek( &header[0] , szPacketHeader );			memcpy( &packetID   , &header[0]          , szPacketID );			memcpy( &packetSize , &header[szPacketID] , szPacketSize );			if (bLog)			{				//cout << "packetID:" << packetID << ",packetSize:" << szPacketHeader + packetSize << endl;				StringStream msg;				msg << "packetID:" << packetID << ",packetSize:" << szPacketHeader + packetSize;				filelog("badUser.txt", "%s", msg.toString().c_str());			}			switch ( packetID ) {				case Packet::PACKET_CU_BEGIN_UPDATE :					{						if (bLog)						{							StringStream msg;							msg << "RECV PACKET CUBeginUpdate[" << packetID << "](" 								<< szPacketHeader + packetSize << "/" << m_pInputStream->length() << ") from "								<< m_pSocket->getHost() << ":" << m_pSocket->getPort();							//cout << msg.toString() << endl;							filelog("badUser.txt", "%s", msg.toString().c_str());						}												if ( packetSize > CUBeginUpdate::getPacketMaxSize() )							throw InvalidProtocolException("too large packet size");						if ( m_PlayerStatus != USPS_BEGIN_SESSION )							throw InvalidProtocolException("invalid packet order");						// 涝仿滚欺郴俊 菩哦农扁父怒狼 单捞鸥啊 甸绢乐绰瘤 犬牢茄促.						// 弥利拳矫 break 甫 荤侩窍搁 等促. (咯扁辑绰 老窜 exception阑 镜 巴捞促.)						if ( m_pInputStream->length() < szPacketHeader + packetSize )						{							bInsufficientData = true;							goto INSUFFICIENT_DATA;							//throw InsufficientDataException();						}						// 菩哦 窍唱甫 佬菌栏聪, expire time 阑 楷扁茄促.						getCurrentTime(m_ExpireTime);						m_ExpireTime.tv_sec += maxIdleSec;							// 盔贰绰 Packet::read()甫 龋免窍搁 郴何俊辑 菩哦 庆歹甫 朝妨 林瘤父.						// 咯扁辑绰 流立 朝妨拎具 茄寸...						m_pInputStream->skip( szPacketHeader );						CUBeginUpdate cuBeginUpdate;						cuBeginUpdate.read( *m_pInputStream );						//cout << "before execute" << endl;						if (bLog)						{							filelog("badUser.txt", "%s", cuBeginUpdate.toString().c_str());							try {								cuBeginUpdate.execute( this );							} catch (Throwable& t) {								filelog("badUser.txt", "%s", t.toString().c_str());							}						}						else						{							cuBeginUpdate.execute( this );						}							//cout << "after execute" << endl;					}					break;				case Packet::PACKET_CU_REQUEST :					{						if (bLog)						{							StringStream msg;							msg << "RECV PACKET CURequest[" << packetID << "](" 								<< szPacketHeader + packetSize << "/" << m_pInputStream->length() << ") from "								<< m_pSocket->getHost() << ":" << m_pSocket->getPort();							//cout << msg.toString() << endl;							filelog("badUser.txt", "%s", msg.toString().c_str());						}						if ( packetSize > CURequest::getPacketMaxSize() )							throw InvalidProtocolException("too large packet size");						if ( m_PlayerStatus != USPS_AFTER_SENDING_UC_UPDATE_LIST && 							 m_PlayerStatus != USPS_AFTER_SENDING_UC_UPDATE )							throw InvalidProtocolException("invalid packet order");						// 涝仿滚欺郴俊 菩哦农扁父怒狼 单捞鸥啊 甸绢乐绰瘤 犬牢茄促.						// 弥利拳矫 break 甫 荤侩窍搁 等促. (咯扁辑绰 老窜 exception阑 镜 巴捞促.)						if ( m_pInputStream->length() < szPacketHeader + packetSize )						{							bInsufficientData = true;							goto INSUFFICIENT_DATA;							//throw InsufficientDataException();						}						// 菩哦 窍唱甫 佬菌栏聪, expire time 阑 楷扁茄促.						getCurrentTime(m_ExpireTime);						m_ExpireTime.tv_sec += maxIdleSec;						// 盔贰绰 Packet::read()甫 龋免窍搁 郴何俊辑 菩哦 庆歹甫 朝妨 林瘤父.						// 咯扁辑绰 流立 朝妨拎具 茄寸...						m_pInputStream->skip( szPacketHeader );						CURequest cuRequest;						cuRequest.read( *m_pInputStream );						cuRequest.execute( this );					}					break;				case Packet::PACKET_CU_END_UPDATE :					{						if (bLog)						{							StringStream msg;							msg << "RECV PACKET UCUpdate[" << packetID << "](" 								<< szPacketHeader + packetSize << "/" << m_pInputStream->length() << ") from "								<< m_pSocket->getHost() << ":" << m_pSocket->getPort();							//cout << msg.toString() << endl;							filelog("badUser.txt", "%s", msg.toString().c_str());						}												if ( packetSize > CUEndUpdate::getPacketMaxSize() )							throw InvalidProtocolException("too large packet size");						if ( m_PlayerStatus != USPS_AFTER_SENDING_UC_UPDATE_LIST || 							 m_PlayerStatus != USPS_AFTER_SENDING_UC_UPDATE )							throw InvalidProtocolException("invalid packet order");						// 涝仿滚欺郴俊 菩哦农扁父怒狼 单捞鸥啊 甸绢乐绰瘤 犬牢茄促.						// 弥利拳矫 break 甫 荤侩窍搁 等促. (咯扁辑绰 老窜 exception阑 镜 巴捞促.)						if ( m_pInputStream->length() < szPacketHeader + packetSize )						{							bInsufficientData = true;							goto INSUFFICIENT_DATA;							//throw InsufficientDataException();						}						// 菩哦 窍唱甫 佬菌栏聪, expire time 阑 楷扁茄促.						getCurrentTime(m_ExpireTime);						m_ExpireTime.tv_sec += maxIdleSec;							// 盔贰绰 Packet::read()甫 龋免窍搁 郴何俊辑 菩哦 庆歹甫 朝妨 林瘤父.						// 咯扁辑绰 流立 朝妨拎具 茄寸...						m_pInputStream->skip( szPacketHeader );						CUEndUpdate cuEndUpdate;						cuEndUpdate.read( *m_pInputStream );						cuEndUpdate.execute( this );					}					break;				default :					{						if (bLog)						{							//cout << "Invalid Packet ID!!!" << endl;							filelog("badUser.txt", "Invalid Packet ID");						}						throw InvalidProtocolException("invalid packet id");					}			}		}	//}		//} catch ( InsufficientDataException ) {// by sigi. 2002.11.9INSUFFICIENT_DATA:	if (bInsufficientData)	{		// 窜瘤 风橇狼 呕免 炼扒老 挥捞促. 惑困肺 傈崔且 鞘夸绰 绝促.		        // expire time 阑 檬苞沁阑 版快 楷搬阑 辆丰茄促.		Timeval currentTime;		getCurrentTime(currentTime);		if (currentTime >= m_ExpireTime)			throw DisconnectException("老沥 矫埃悼救 涝仿窍瘤 臼阑 版快, 楷搬阑 辆丰钦聪促.");	}//	__END_DEBUG	__END_CATCH}		    //--------------------------------------------------------------------------------// 免仿阑 滚欺傅窍瘤 臼扁 锭巩俊, 酒公 巴档 窍瘤 臼酒档 等促.//--------------------------------------------------------------------------------void UpdateServerPlayer::processOutput ()	throw ( IOException , Error ){	__BEGIN_TRY	// do nothing	__END_CATCH}//--------------------------------------------------------------------------------// send packet to socket//--------------------------------------------------------------------------------void UpdateServerPlayer::sendPacket ( Packet * pPacket )	throw ( ProtocolException , Error ){	__BEGIN_TRY	__BEGIN_DEBUG	//cout << "SEND PACKET " << pPacket->getPacketName().c_str() << " to "//		<< m_pSocket->getHost().c_str() << ":" << m_pSocket->getPort() << endl;	PacketID_t packetID = pPacket->getPacketID();	PacketSize_t packetSize = pPacket->getPacketSize();	m_pSocket->send( &packetID , szPacketID );	m_pSocket->send( &packetSize , szPacketSize );	// 菩哦阑 家南俊 流立 谎赴促.	pPacket->write( m_pSocket );	//cout << "Send Packet Size : " << pPacket->getPacketSize() << endl;	//cout << "Send Buffer Size : " << m_pSocket->getSendBufferSize() << endl;	__END_DEBUG	__END_CATCH}//--------------------------------------------------------------------------------// disconnect player//--------------------------------------------------------------------------------void UpdateServerPlayer::disconnect ( bool bDisconnected )	throw ( Error ){	__BEGIN_TRY	if ( bDisconnected == UNDISCONNECTED ) {		// 免仿 滚欺俊 巢酒乐绰 单捞鸥甫 傈价茄促.		m_pOutputStream->flush();	}	// 家南 楷搬阑 摧绰促.	m_pSocket->close();	// 敲饭捞绢狼 惑怕甫 肺弊酒眶栏肺 父电促.	Assert( m_PlayerStatus != USPS_END_SESSION );	m_PlayerStatus = USPS_END_SESSION;	__END_CATCH}//--------------------------------------------------------------------------------//// get debug string////--------------------------------------------------------------------------------string UpdateServerPlayer::toString () const       throw ( Error ){	__BEGIN_TRY			StringStream msg;		msg << "UpdateServerPlayer("		<< "SocketID:" << m_pSocket->getSOCKET() 		<< ",Host:" << m_pSocket->getHost() 		<< ",Port:" << m_pSocket->getPort() 		<< ")" ;	return msg.toString();	__END_CATCH}

⌨️ 快捷键说明

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