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