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; }