socketinputstream.cpp
来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 636 行 · 第 1/2 页
CPP
636 行
// // 林狼且 痢篮, m_Head == 0 老 版快, m_Tail 捞 滚欺狼 场阑 倒酒辑 促矫 0 栏肺 // 登霸 登搁 buffer empty 客 鞍篮 惑怕啊 等促绰 痢捞促. 蝶扼辑, m_Head 甫 眉农 // 秦辑 0 老 版快 m_Tail 阑 困秦辑 滚欺狼 盖 付瘤阜 沫阑 厚况抵具 窍摆促. ^^ nFree = m_BufferLen - m_Tail - 1; nReceived = m_pSocket->receive( &m_Buffer[m_Tail] , nFree ); // by sigi. NonblockException力芭. 2002.5.17 if (nReceived==0) return 0; m_Tail += nReceived; nFilled += nReceived; if ( nReceived == nFree ) { // 家南狼 receive 滚欺俊 单捞鸥啊 巢酒乐阑 啊瓷己捞 乐促. // 弊矾唱, 涝仿 滚欺俊 咯蜡 傍埃捞 绝栏骨肺 单捞鸥啊 巢酒 // 乐促搁 滚欺甫 刘啊矫难具 茄促. uint available = m_pSocket->available(); if ( available > 0 ) { resize( available + 1 ); // resize 登搁, 郴何狼 单捞鸥啊 沥纺登骨肺 m_Tail 何磐 静搁 等促. nReceived = m_pSocket->receive( &m_Buffer[m_Tail] , available ); // by sigi. NonblockException力芭. 2002.5.17 if (nReceived==0) return 0; m_Tail += nReceived; nFilled += nReceived; } } } else { // m_Head != 0 // // H T // 0123456789 // ...abcd... // // 捞 版快, m_Tail 捞 滚欺狼 菊率栏肺 逞绢啊档 公规窍促. nFree = m_BufferLen - m_Tail; nReceived = m_pSocket->receive( &m_Buffer[m_Tail] , nFree ); // by sigi. NonblockException力芭. 2002.5.17 if (nReceived==0) return 0; m_Tail = ( m_Tail + nReceived ) % m_BufferLen; nFilled += nReceived; if ( nReceived == nFree ) { Assert( m_Tail == 0 ); // 家南狼 receive 滚欺俊 单捞鸥啊 歹 巢酒乐阑 啊瓷己捞 乐促. // 蝶扼辑, 涝仿 滚欺狼 菊率 咯蜡 傍埃俊 单捞鸥甫 静档废 茄促. // 窜 捞锭俊档 m_Head == m_Tail 捞搁 empty 啊 登骨肺, // -1 临捞档废 茄促. nFree = m_Head - 1; nReceived = m_pSocket->receive( &m_Buffer[0] , nFree ); // by sigi. NonblockException力芭. 2002.5.17 if (nReceived==0) return 0; m_Tail += nReceived; nFilled += nReceived; if ( nReceived == nFree ) { // buffer is full // 滚欺啊 啊垫 蛮 惑怕老 版快, 家南狼 receive 滚欺俊 单捞鸥啊 歹 // 巢酒乐阑 啊瓷己捞 乐促. 蝶扼辑, 佬绢焊绊 歹 乐栏搁 滚欺甫 刘啊矫挪促. uint available = m_pSocket->available(); if ( available > 0 ) { resize( available + 1 ); // resize 登搁, 郴何狼 单捞鸥啊 沥纺登骨肺 m_Tail 何磐 静搁 等促. nReceived = m_pSocket->receive( &m_Buffer[m_Tail] , available ); // by sigi. NonblockException力芭. 2002.5.17 if (nReceived==0) return 0; m_Tail += nReceived; nFilled += nReceived; } } } } } else { // reversed order ( m_Head > m_Tail ) // // T H // 0123456789 // abcd...efg // nFree = m_Head - m_Tail - 1; nReceived = m_pSocket->receive( &m_Buffer[m_Tail] , nFree ); // by sigi. NonblockException力芭. 2002.5.17 if (nReceived==0) return 0; m_Tail += nReceived; nFilled += nReceived; if ( nReceived == nFree ) { // buffer is full // 捞 版快, 家南狼 receive 滚欺俊 单捞鸥啊 歹 巢酒乐阑 // 啊瓷己捞 乐促. 蝶扼辑, 佬绢焊绊 歹 乐栏搁 滚欺甫 刘啊矫挪促. uint available = m_pSocket->available(); if ( available > 0 ) { resize( available + 1 ); // resize 登搁, 郴何狼 单捞鸥啊 沥纺登骨肺 m_Tail 何磐 静搁 等促. nReceived = m_pSocket->receive( &m_Buffer[m_Tail] , available ); // by sigi. NonblockException力芭. 2002.5.17 if (nReceived==0) return 0; m_Tail += nReceived; nFilled += nReceived; } } } return nFilled; __END_CATCH}//////////////////////////////////////////////////////////////////////// fill buffer from socket//// 俊叼飘 夸噶 - 酒流 救 绊闷澜. 0 -;////////////////////////////////////////////////////////////////////////uint SocketInputStream::fill_RAW () throw ( IOException , Error ){ __BEGIN_TRY #if __LINUX__ uint nfree = m_BufferLen - m_Tail - 1; int nread = recv( m_pSocket->getSOCKET() , &m_Buffer[m_Tail] , nfree , 0 ); if ( nread < 0 ) { if ( errno == EWOULDBLOCK ) { // NonBlockingIOException nread = 0; } else if ( errno == ECONNRESET ) { // ConnectException throw ConnectException(); } else { // Error throw UnknownError(strerror(errno),errno); } } else if ( nread == 0 ) { // EOFException throw EOFException(); } m_Tail += nread; if ( nread == (int)nfree ) { // 单捞鸥啊 歹 乐阑 啊瓷己捞 乐促. uint more = 0; int result = ioctl( m_pSocket->getSOCKET() , FIONREAD , &more ); if ( result < 0 ) throw UnknownError(strerror(errno),errno); if ( more > 0 ) { // 滚欺甫 刘啊矫挪促. resize( more + 1 ); // 滚欺甫 盲款促. nread = recv( m_pSocket->getSOCKET() , &m_Buffer[m_Tail] , more , 0 ); // 公炼扒 more 父怒 佬绢具 茄促. 弊犯瘤 臼阑 版快 俊矾促. Assert( (int)more == nread ); nread += more; } } return nread;#elif __WINDOWS__ throw UnsupportedError();#endif __END_CATCH}//////////////////////////////////////////////////////////////////////// resize buffer//////////////////////////////////////////////////////////////////////void SocketInputStream::resize ( int size ) throw ( IOException , Error ){ __BEGIN_TRY Assert( size != 0 ); // resize size炼例. by sigi. 2002.10.7 size = max(size, (int)(m_BufferLen>>1)); uint newBufferLen = m_BufferLen + size; uint len = length(); if ( size < 0 ) { // 父距 农扁甫 临捞妨绰单 滚欺俊 甸绢乐绰 单捞鸥甫 // 促 给淬酒尘 版快 if ( newBufferLen < 0 || newBufferLen < len ) throw IOException("new buffer is too small!"); } // 货 滚欺甫 且寸罐绰促. char * newBuffer = new char[ newBufferLen ]; // 盔贰 滚欺狼 郴侩阑 汗荤茄促. if ( m_Head < m_Tail ) { // // H T // 0123456789 // ...abcd... // memcpy( newBuffer , &m_Buffer[m_Head] , m_Tail - m_Head ); } else if ( m_Head > m_Tail ) { // // T H // 0123456789 // abcd...efg // memcpy( newBuffer , &m_Buffer[m_Head] , m_BufferLen - m_Head ); memcpy( &newBuffer[ m_BufferLen - m_Head ] , m_Buffer , m_Tail ); } // 盔贰 滚欺甫 昏力茄促. delete [] m_Buffer; // 滚欺 棺 滚欺 农扁甫 犁汲沥茄促. m_Buffer = newBuffer; m_BufferLen = newBufferLen; m_Head = 0; m_Tail = len; // m_Tail 篮 甸绢乐绰 单捞鸥狼 辨捞客 鞍促. ofstream ofile("buffer_resized.log",ios::app); ofile << "SocketInputStream resized " << size << " bytes!" << endl; ofile.close(); __END_CATCH}////////////////////////////////////////////////////////////////////////// get data's size in buffer//// NOTES//// H T T H// 0123456789 0123456789// ...abcd... abcd...efg//// 7 - 3 = 4 10 - ( 7 - 4 ) = 7//// CAUTION//// m_Tail 捞 后 沫阑 啊府虐绊 乐促绰 巴俊 蜡狼窍扼. // 滚欺狼 农扁啊 m_BufferLen 扼搁 角力 捞 钮俊 甸绢哎 // 荐 乐绰 单捞鸥绰 ( m_BufferLen - 1 ) 捞 等促.////////////////////////////////////////////////////////////////////////uint SocketInputStream::length () const throw (){ __BEGIN_TRY if ( m_Head < m_Tail ) return m_Tail - m_Head; else if ( m_Head > m_Tail ) return m_BufferLen - m_Head + m_Tail; return 0; __END_CATCH}//////////////////////////////////////////////////////////////////////// get debug string//////////////////////////////////////////////////////////////////////string SocketInputStream::toString () const throw (){ StringStream msg; msg << "SocketInputStream(" << "BufferLen:" << m_BufferLen << ",Head:" << m_Head << ",Tail:" << m_Tail << ")"; return msg.toString();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?