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 + -
显示快捷键?