socketinputstream.cpp
来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 636 行 · 第 1/2 页
CPP
636 行
//////////////////////////////////////////////////////////////////////// // SocketInputStream.cpp// // by Reiot// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// include files//////////////////////////////////////////////////#include "SocketInputStream.h"#include <errno.h>#include "Assert.h"#include "Packet.h"#if __LINUX__ #include <sys/ioctl.h>#elif __WINDOWS__ #include <winsock.h>#endif//////////////////////////////////////////////////////////////////////// constructor//////////////////////////////////////////////////////////////////////SocketInputStream::SocketInputStream ( Socket * sock , uint BufferLen ) throw ( Error ): m_pSocket(sock), m_Buffer(NULL), m_BufferLen(BufferLen), m_Head(0), m_Tail(0){ __BEGIN_TRY Assert( m_pSocket != NULL ); Assert( m_BufferLen > 0 ); m_Buffer = new char[ m_BufferLen ]; __END_CATCH} //////////////////////////////////////////////////////////////////////// destructor//////////////////////////////////////////////////////////////////////SocketInputStream::~SocketInputStream () throw ( Error ){ __BEGIN_TRY SAFE_DELETE_ARRAY(m_Buffer); __END_CATCH} ////////////////////////////////////////////////////////////////////////// read data from input buffer////////////////////////////////////////////////////////////////////////uint SocketInputStream::read ( char * buf , uint len ) throw ( ProtocolException , Error ){// __BEGIN_TRY Assert( buf != NULL ); if ( len == 0 ) throw InvalidProtocolException("len==0"); // 夸没茄 父怒狼 单捞鸥啊 滚欺郴俊 粮犁窍瘤 臼阑 版快 抗寇甫 带柳促. // 父距 葛电 read 啊 peek() 肺 眉农茄 饶 龋免等促搁, 酒贰 if-throw 绰 // 吝汗等 皑捞 乐促. 蝶扼辑, 内膏飘肺 贸府秦档 公规窍促. // 窜 酒贰 内靛甫 内膏飘贸府窍搁, 官肺 酒贰狼 if-else 甫 'if'-'else if'-'else' // 肺 荐沥秦拎具 茄促. if ( len > length() ) throw InsufficientDataException( len - length() ); if ( m_Head < m_Tail ) { // normal order // // H T // 0123456789 // ...abcd... // memcpy( buf , &m_Buffer[m_Head] , len ); } else { // reversed order ( m_Head > m_Tail ) // // T H // 0123456789 // abcd...efg // uint rightLen = m_BufferLen - m_Head; if ( len <= rightLen ) { memcpy( buf , &m_Buffer[m_Head] , len ); } else { memcpy( buf , &m_Buffer[m_Head] , rightLen ); memcpy( &buf[rightLen] , m_Buffer , len - rightLen ); } } m_Head = ( m_Head + len ) % m_BufferLen; return len; // __END_CATCH}//////////////////////////////////////////////////////////////////////// read data from input buffer//////////////////////////////////////////////////////////////////////uint SocketInputStream::read ( string & str , uint len ) throw ( ProtocolException , Error ){ __BEGIN_TRY if ( len == 0 ) throw InvalidProtocolException("len==0"); // 夸没茄 父怒狼 单捞鸥啊 滚欺郴俊 粮犁窍瘤 臼阑 版快 抗寇甫 带柳促. // 父距 葛电 read 啊 peek() 肺 眉农茄 饶 龋免等促搁, 酒贰 if-throw 绰 // 吝汗等 皑捞 乐促. 蝶扼辑, 内膏飘肺 贸府秦档 公规窍促. // 窜 酒贰 内靛甫 内膏飘贸府窍搁, 官肺 酒贰狼 if-else 甫 if-else if-else // 肺 荐沥秦拎具 茄促. if ( len > length() ) throw InsufficientDataException( len - length() ); // 胶飘傅俊促啊 len 父怒 傍埃阑 固府 且寸茄促. str.reserve( len ); if ( m_Head < m_Tail ) { // normal order // // H T // 0123456789 // ...abcd... // str.assign( &m_Buffer[m_Head] , len ); } else { // reversed order ( m_Head > m_Tail ) // // T H // 0123456789 // abcd...efg // uint rightLen = m_BufferLen - m_Head; if ( len <= rightLen ) { str.assign( &m_Buffer[m_Head] , len ); } else { str.assign( &m_Buffer[m_Head] , rightLen ); str.append( m_Buffer , len - rightLen ); } } m_Head = ( m_Head + len ) % m_BufferLen; return len; __END_CATCH}//////////////////////////////////////////////////////////////////////// read packet from input buffer//////////////////////////////////////////////////////////////////////void SocketInputStream::readPacket ( Packet * pPacket ) throw ( ProtocolException , Error ){ __BEGIN_TRY // 捞固 惑困 饭骇俊辑 ID, Size甫 佬绊 ID俊 嘎绰 菩哦按眉甫 父甸绢辑 // 颇扼固磐肺 逞板栏骨肺 ID 绰 skip 茄促. Size绰 按眉狼 官捞呈府 // 捞固瘤啊 葛滴 档馒沁绰瘤父 眉农且挥, 按眉狼 檬扁拳客绰 公包窍扁 // 锭巩俊 skip 茄促. skip( szPacketHeader ); // 捞力 窍困 菩哦 努贰胶俊 沥狼等 皋筋靛甫 荐青窍搁, 郴何俊辑 // 舅酒辑 肋 檬扁拳窍霸 等促. // 窜 绢恫 菩哦狼 read()俊辑 撇府霸 登搁 弊 捞饶狼 葛电 菩哦篮 // 颇教捞 阂啊瓷窍霸 等促. 蝶扼辑, 菩哦 努贰胶甫 叼磊牢且 锭 // 林狼秦具 茄促. pPacket->read( *this ); __END_CATCH}//////////////////////////////////////////////////////////////////////// peek data from buffer//////////////////////////////////////////////////////////////////////bool SocketInputStream::peek ( char * buf , uint len ) throw ( ProtocolException , Error ){// __BEGIN_TRY Assert( buf != NULL ); if ( len == 0 ) throw InvalidProtocolException("len==0"); // 夸没茄 农扁焊促 滚欺狼 单捞鸥啊 利篮 版快, 抗寇甫 带柳促. if ( len > length() ) //throw InsufficientDataException( len - length() ); // NoSuch力芭. by sigi. 2002.5.4 return false; // buf 俊 汗荤绰 窍登, m_Head 绰 函拳矫虐瘤 臼绰促. if ( m_Head < m_Tail ) { // normal order // // H T // 0123456789 // ...abcd... // memcpy( buf , &m_Buffer[m_Head] , len ); } else { // reversed order ( m_Head > m_Tail ) // // T H // 0123456789 // abcd...efg // uint rightLen = m_BufferLen - m_Head; if ( len <= rightLen ) { memcpy( &buf[0] , &m_Buffer[m_Head] , len ); } else { memcpy( &buf[0] , &m_Buffer[m_Head] , rightLen ); memcpy( &buf[rightLen] , &m_Buffer[0] , len - rightLen ); } } return true;// __END_CATCH} ////////////////////////////////////////////////////////////////////////// skip data from buffer//// read(N) == peek(N) + skip(N)////////////////////////////////////////////////////////////////////////void SocketInputStream::skip ( uint len ) throw ( ProtocolException , Error ){ __BEGIN_TRY if ( len == 0 ) throw InvalidProtocolException("len==0"); if ( len > length() ) throw InsufficientDataException( len - length() ); // m_Head 甫 刘啊矫挪促. m_Head = ( m_Head + len ) % m_BufferLen; __END_CATCH} ////////////////////////////////////////////////////////////////////////// fill buffer from socket//// 单捞鸥啊 绝阑 版快 0 阑 府畔茄促.// 弊繁单, NonBlocking 老 版快 NonBlockingIOException 阑 带柳促.//// *NOTES*//// 啊厘 浆款 规过篮 窃荐俊促啊 char buf[N]; 阑 急攫茄 饶俊 咯扁促啊// receive() 搬苞蔼阑 历厘茄 饶, 滚欺俊 汗荤窍绰 巴捞促. 弊矾唱, 捞// 规过篮 汗荤啊 2雀 惯积窍扁 锭巩俊 瘤剧登绢具 窍摆促. //// 蝶扼辑, 胶飘覆狼 郴何 滚欺俊促啊 流立 结具 窍绰单, 捞锭 郴何 滚欺啊// circular 捞骨肺, normal order 老 版快俊绰 2雀 捞惑 receive()啊 龋免瞪// 犬伏捞 乐霸 等促.//// 捞锭 霉锅掳 receive()俊辑 家南狼 receive 滚欺狼 单捞鸥甫 促 佬绢滚府绊, // 悼矫俊 滚欺狼 场俊 档崔茄 版快 滴锅掳 receive() 俊辑 NonBlockingIOException // 捞 惯积窍霸 等促. (拱沸 捞繁 版快绰 靛拱促. 滚欺狼 场苞 盖菊俊 吧媚辑 // 单捞鸥啊 结龙 版快绰 辆辆 惯积茄促 摹歹扼档.. ) //// 磊. 捞凡 版快 fill()篮 寇何肺 NonBlockingIOException 阑 带廉具 窍绰啊?// 酒聪搁 瘤陛鳖瘤 佬篮 单捞鸥 农扁甫 府畔秦具 窍绰啊? 沥翠篮 饶磊促. ^^;// 溜 郴 妇措肺具~~~ 捞洒洒洒洒洒~////////////////////////////////////////////////////////////////////////uint SocketInputStream::fill () throw ( IOException , Error ){ __BEGIN_TRY uint nFilled = 0; // 滚欺俊 盲况持篮 农扁 uint nReceived; // Socket::receive()肺 茄锅 佬绢甸牢 农扁 uint nFree; // 滚欺狼 后 康开狼 农扁 if ( m_Head <= m_Tail ) { // normal order // m_Head == m_Tail 老 版快绰 滚欺啊 后 惑怕甫 唱鸥辰促. // 老窜 滚欺狼 坷弗率 后 傍埃父阑 盲款促. if ( m_Head == 0 ) { // // H T // 0123456789 // abcd......
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?