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