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