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); } */ }
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; }