📄 gameserverplayer.cpp
字号:
//////////////////////////////////////////////////////////////////////// // Filename : GameServerPlayer.cpp // Written By : Reiot// //////////////////////////////////////////////////////////////////////// include files#include "GameServerPlayer.h"#include "Socket.h"#include "SocketInputStream.h"#include "SocketOutputStream.h"#include "Assert.h"#include "Packet.h"#include "PacketFactoryManager.h"// by sigi. 2002.11.12const int defaultGameServerPlayerInputStreamSize = 10240;const int defaultGameServerPlayerOutputStreamSize = 163840;////////////////////////////////////////////////////////////////////////// constructor////////////////////////////////////////////////////////////////////////GameServerPlayer::GameServerPlayer () throw ( Error )//: m_pSocket(NULL), m_pInputStream(NULL), m_pOutputStream(NULL){}GameServerPlayer::GameServerPlayer (Socket * pSocket) throw ( Error )//: Player( pSocket )//m_pSocket(pSocket), m_pInputStream(NULL), m_pOutputStream(NULL){ __BEGIN_TRY Assert( pSocket != NULL ); m_pSocket = pSocket; // create socket input stream m_pInputStream = new SocketInputStream( m_pSocket, defaultGameServerPlayerInputStreamSize ); Assert( m_pInputStream != NULL ); // create socket output stream m_pOutputStream = new SocketOutputStream( m_pSocket, defaultGameServerPlayerOutputStreamSize ); Assert( m_pOutputStream != NULL ); __END_CATCH}////////////////////////////////////////////////////////////////////////// destructor////////////////////////////////////////////////////////////////////////GameServerPlayer::~GameServerPlayer () 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 GameServerPlayer::processInput() throw ( IOException, Error ){ __BEGIN_TRY try { m_pInputStream->fill(); } catch ( NonBlockingIOException& nbie ) { } __END_CATCH}void GameServerPlayer::processOutput() throw ( IOException, Error ){ __BEGIN_TRY try { m_pOutputStream->flush(); } catch ( InvalidProtocolException& ) { throw DisconnectException( "捞惑茄 菩哦烙" ); } __END_CATCH}////////////////////////////////////////////////////////////////////////// parse packet and execute handler for the packet////////////////////////////////////////////////////////////////////////void GameServerPlayer::processCommand () throw ( IOException , Error ){ __BEGIN_TRY try { // 庆歹甫 烙矫历厘且 滚欺 积己 char header[szPacketHeader]; PacketID_t packetID; PacketSize_t packetSize; Packet * pPacket; // 涝仿滚欺俊 甸绢乐绰 肯傈茄 菩哦甸阑 葛炼府 贸府茄促. while ( true ) { // 涝仿胶飘覆俊辑 菩哦庆歹农扁父怒 佬绢夯促. // 父距 瘤沥茄 农扁父怒 胶飘覆俊辑 佬阑 荐 绝促搁, // Insufficient 抗寇啊 惯积窍绊, 风橇甫 狐廉唱埃促. if ( !m_pInputStream->peek( header , szPacketHeader ) ) break; // 菩哦酒捞叼 棺 菩哦农扁甫 舅酒辰促. // 捞锭 菩哦农扁绰 庆歹甫 器窃茄促. 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->readPacket( 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} ////////////////////////////////////////////////////////////////////////// send packet to player's output buffer////////////////////////////////////////////////////////////////////////void GameServerPlayer::sendPacket ( Packet * pPacket ) throw ( ProtocolException , Error ){ __BEGIN_TRY m_pOutputStream->writePacket( pPacket ); /* cout << endl; cout << "=== GameServerPlayer::sendPacket() ===" << endl; cout << pPacket->toString() << endl; cout << "============================" << endl; */ __END_CATCH}////////////////////////////////////////////////////////////////////////// disconnect ( close socket )////////////////////////////////////////////////////////////////////////void GameServerPlayer::disconnect ( bool bDisconnected ) throw (InvalidProtocolException, Error){ __BEGIN_TRY try { // 沥寸窍霸 肺弊酒眶茄 版快俊绰 免仿 滚欺甫 敲矾矫且 荐 乐促. // 弊矾唱, 阂过利牢 叼胶甫 吧菌促搁 家南捞 摧板栏骨肺 // 敲矾矫且 版快 SIG_PIPE 阑 罐霸 等促. if ( bDisconnected == UNDISCONNECTED ) { m_pOutputStream->flush(); } m_pSocket->close(); } catch ( InvalidProtocolException & t ) { cerr << "GameServerPlayer::disconnect Exception Check!!" << endl; cerr << t.toString() << endl; m_pSocket->close(); //throw Error("揪官..."); } __END_CATCH}//////////////////////////////////////////////////////////////////////// set socket//////////////////////////////////////////////////////////////////////void GameServerPlayer::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 GameServerPlayer::toString () const throw ( Error ){ __BEGIN_TRY StringStream msg; msg << "GameServerPlayer(" << "SocketID:" << m_pSocket->getSOCKET() << ",Host:" << m_pSocket->getHost() << ",ID:" << m_ID << ")" ; return msg.toString(); __END_CATCH}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -