player.cpp

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

CPP
327
字号
//////////////////////////////////////////////////////////////////////// // Filename    : Player.cpp // Written By  : Reiot// //////////////////////////////////////////////////////////////////////// include files#include <stdio.h>#include "Player.h"#include "Socket.h"#include "SocketInputStream.h"#include "SocketOutputStream.h"#include "Assert.h"#include "Packet.h"//#include "PacketFactoryManager.h"////////////////////////////////////////////////////////////////////////// constructor////////////////////////////////////////////////////////////////////////Player::Player ()	 throw ( Error ): m_pSocket(NULL), m_pInputStream(NULL), m_pOutputStream(NULL){}Player::Player ( Socket * pSocket )	 throw ( Error ): m_pSocket(pSocket), m_pInputStream(NULL), m_pOutputStream(NULL){	__BEGIN_TRY			Assert( m_pSocket != NULL );	// create socket input stream	m_pInputStream = new SocketInputStream( m_pSocket );	Assert( m_pInputStream != NULL );		// create socket output stream	m_pOutputStream = new SocketOutputStream( m_pSocket );	Assert( m_pOutputStream != NULL );	__END_CATCH}////////////////////////////////////////////////////////////////////////// destructor////////////////////////////////////////////////////////////////////////Player::~Player ()	 throw ( Error ){	__BEGIN_TRY			// delete socket input stream	SAFE_DELETE(m_pInputStream);	// delete socket output stream	SAFE_DELETE(m_pOutputStream);	// delete socket	if ( m_pSocket != NULL ) 	{		m_pSocket->close();		delete m_pSocket;		m_pSocket = NULL;	}	__END_CATCH}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void Player::processInput ()	throw ( IOException , Error ){	__BEGIN_TRY	try 	{		m_pInputStream->fill();	} 	catch (NonBlockingIOException& nbie) 	{		//cout << nbie.toString().c_str() << endl;	}	__END_CATCH}////////////////////////////////////////////////////////////////////////// parse packet and execute handler for the packet////////////////////////////////////////////////////////////////////////void Player::processCommand ( bool Option )      throw ( IOException , Error ){	__BEGIN_TRY/*	try {		// 庆歹甫 烙矫历厘且 滚欺 积己		char header[szPacketHeader];		PacketID_t packetID;		PacketSize_t packetSize;		Packet * pPacket;		// 涝仿滚欺俊 甸绢乐绰 肯傈茄 菩哦甸阑 葛炼府 贸府茄促.		while ( true ) {					// 涝仿胶飘覆俊辑 菩哦庆歹农扁父怒 佬绢夯促.			// 父距 瘤沥茄 农扁父怒 胶飘覆俊辑 佬阑 荐 绝促搁,			// Insufficient 抗寇啊 惯积窍绊, 风橇甫 狐廉唱埃促.			m_pInputStream->peek( header , szPacketHeader );			// 菩哦酒捞叼 棺 菩哦农扁甫 舅酒辰促.			// 捞锭 菩哦农扁绰 庆歹甫 器窃茄促.			memcpy( &packetID   , &header[0] , szPacketID );				memcpy( &packetSize , &header[szPacketID] , szPacketSize );			// 菩哦 酒捞叼啊 捞惑窍搁 橇肺配妮 俊矾肺 埃林茄促.			if ( packetID >= Packet::PACKET_MAX )				throw InvalidProtocolException("invalid packet id");						// 菩哦 农扁啊 呈公 农搁 橇肺配妮 俊矾肺 埃林茄促.			if ( packetSize > g_pPacketFactoryManager->getPacketMaxSize(packetID) )				throw InvalidProtocolException("too large packet size");						// 涝仿滚欺郴俊 菩哦农扁父怒狼 单捞鸥啊 甸绢乐绰瘤 犬牢茄促.			// 弥利拳矫 break 甫 荤侩窍搁 等促. (咯扁辑绰 老窜 exception阑 镜 巴捞促.)			if ( m_pInputStream->length() < szPacketHeader + packetSize )				throw InsufficientDataException();						// 咯扁鳖瘤 吭促搁 涝仿滚欺俊绰 肯傈茄 菩哦 窍唱 捞惑捞 甸绢乐促绰 舵捞促.			// 菩哦蒲配府概聪历肺何磐 菩哦酒捞叼甫 荤侩秦辑 菩哦 胶飘钒贸甫 积己窍搁 等促.			// 菩哦酒捞叼啊 肋给瞪 版快绰 菩哦蒲配府概聪历俊辑 贸府茄促.			pPacket = g_pPacketFactoryManager->createPacket( packetID );			// 捞力 捞 菩哦胶飘钒贸甫 檬扁拳茄促.			// 菩哦窍困努贰胶俊 沥狼等 read()啊 virtual 皋目聪硫俊 狼秦辑 龋免登绢			// 磊悼利栏肺 檬扁拳等促.			m_pInputStream->read( pPacket );						// 捞力 捞 菩哦胶飘钒贸甫 啊瘤绊 菩哦勤甸矾甫 荐青窍搁 等促.			// 菩哦酒捞叼啊 肋给瞪 版快绰 菩哦勤甸矾概聪历俊辑 贸府茄促.			pPacket->execute( this );						// 菩哦阑 昏力茄促			delete pPacket;		}	} catch ( NoSuchElementException & nsee ) {		// PacketFactoryManager::createPacket(PacketID_t)		// PacketFactoryManager::getPacketMaxSize(PacketID_t)		// 俊辑 带龙 啊瓷己捞 乐促.		throw Error( nsee.toString() );	} catch ( InsufficientDataException ) {		// do nothing	} */	__END_CATCH}		    ////////////////////////////////////////////////////////////////////////// flush output buffer to socket's send buffer////////////////////////////////////////////////////////////////////////void Player::processOutput ()	throw ( IOException , Error, ProtocolException ){	__BEGIN_TRY	try 	{		m_pOutputStream->flush();	} 	catch ( InvalidProtocolException & t ) 	{		cerr << t.toString() << endl;		throw InvalidProtocolException("Player::processOutput俊辑 惑困肺 带柳促 穿啊 罐畴?");	}	__END_CATCH}////////////////////////////////////////////////////////////////////////// send packet to player's output buffer////////////////////////////////////////////////////////////////////////void Player::sendPacket ( Packet * pPacket )	throw ( ProtocolException , Error ){	__BEGIN_TRY	if (m_pOutputStream!=NULL)	// -_-;		m_pOutputStream->writePacket( pPacket );	/*	cout << endl;	cout << "=== Player::sendPacket() ===" << endl;	cout << pPacket->toString() << endl;	cout << "============================" << endl;	*/	__END_CATCH}////////////////////////////////////////////////////////////////////////// send stream to player's output buffer////////////////////////////////////////////////////////////////////////void Player::sendStream ( SocketOutputStream* pOutputStream )	throw ( ProtocolException , Error ){	__BEGIN_TRY	if (m_pOutputStream!=NULL)		m_pOutputStream->write( pOutputStream->getBuffer(), pOutputStream->length() );	__END_CATCH}////////////////////////////////////////////////////////////////////////// disconnect ( close socket )////////////////////////////////////////////////////////////////////////void Player::disconnect ( bool bDisconnected )	throw (InvalidProtocolException, Error){	__BEGIN_TRY	try 	{		// 沥寸窍霸 肺弊酒眶茄 版快俊绰 免仿 滚欺甫 敲矾矫且 荐 乐促.		// 弊矾唱, 阂过利牢 叼胶甫 吧菌促搁 家南捞 摧板栏骨肺		// 敲矾矫且 版快 SIG_PIPE 阑 罐霸 等促.		if ( bDisconnected == UNDISCONNECTED ) 		{			m_pOutputStream->flush();		}		m_pSocket->close();	} 	catch ( InvalidProtocolException & t ) 	{		cerr << "Player::disconnect Exception Check!!" << endl;		cerr << t.toString() << endl;		m_pSocket->close();		//throw Error("揪官...");	}	__END_CATCH}//////////////////////////////////////////////////////////////////////// set socket//////////////////////////////////////////////////////////////////////void Player::setSocket ( Socket * pSocket )	throw (){	__BEGIN_TRY	m_pSocket = pSocket;	if ( m_pInputStream != NULL ) 	{		delete m_pInputStream;		m_pInputStream = new SocketInputStream( m_pSocket );	}	if ( m_pOutputStream != NULL ) {		delete m_pOutputStream;		m_pOutputStream = new SocketOutputStream( m_pSocket );	}	__END_CATCH}////////////////////////////////////////////////////////////////////////// get debug string////////////////////////////////////////////////////////////////////////string Player::toString () const       throw ( Error ){	__BEGIN_TRY			StringStream msg;		msg << "Player("		<< "SocketID:" << m_pSocket->getSOCKET() 		<< ",Host:" << m_pSocket->getHost() 		<< ",ID:" << m_ID		<< ")" ;	return msg.toString();	__END_CATCH}

⌨️ 快捷键说明

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