Beispiel #1
0
		protected void ParseMutiPack(byte[] body)
		{
			ByteArray bin_buf = new ByteArray(body);
			
			byte num = 0;
			bin_buf.Get_(out num);
			
			for (int i=0; i<num; i++)
			{
				ushort sinle_pack_len = 0;
				bin_buf.Get_(out sinle_pack_len);
				
				byte[] buf = new byte[sinle_pack_len];
				Array.Copy(bin_buf.GetByteArray_(sinle_pack_len), buf, sinle_pack_len);
				
				ParseSinglePack(buf);
			}
			
			/* C++ code.
			bin_buf.get(num);
		
			for (int i=0; i<num; ++i)
			{
				USHORT single_pack_len = 0;
				bin_buf.get(single_pack_len);
		
				static std::vector<UCHAR> buf;
				buf.clear();
				buf.resize(single_pack_len);
				
				bin_buf.read(&buf[0], single_pack_len);
		
				ParseSinglePack(&buf[0], single_pack_len);
			}
			*/
		}
Beispiel #2
0
		protected virtual int OnSplitPacket()
		{	
			byte[] recv_buf = mRecvBuffer.ToArray();
			ByteArray total_buffer = new ByteArray(recv_buf);
			
			int header_size = _get_header_size();
			int read = 0;
			int size_remain = recv_buf.Length;
			while (size_remain > header_size)	// Recv data len must contain one header at least.
			{
				byte[] cur_buf = total_buffer.GetRange(read, header_size);
				ByteArray packet = new ByteArray(cur_buf);
				
				// Get header info.
				NetCoreHeader h = new NetCoreHeader();
				packet.Get_(out h.length);
				packet.Get_(out h.encrypt);			
		
				// Get packet's len.
				int packet_len = _get_packet_total_len(h);
				
				if (packet_len <= size_remain)
				{
					byte[] body = total_buffer.GetRange(read + _get_header_size(), h.length);
	
					if (h.encrypt == 24)
						ParseSinglePack(body);
					else
						ParseMutiPack(body);
		
					size_remain -= packet_len;
					read += packet_len;
				}
				else
				{
					// Wait for more data.
					break;
				}
			}
		
			return read;
		}