protected override void OnReceive(int num_bytes) { if (num_bytes < 6) { m_inOffset = 0; return; } bool isDecrypted = false; short packetLength = 0; PacketId packetId = default(PacketId); int startOffset = m_inOffset - num_bytes; if (!isDecrypted) { if (IsEncrypted) { DecryptHeader(ref m_inBuf, startOffset); } packetLength = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(m_inBuf, startOffset)); packetId = (RealmServerOpCode)BitConverter.ToUInt32(m_inBuf, startOffset + 2); m_log.DebugFormat("Received {0}/{1}", packetId, packetLength); isDecrypted = true; } if (packetLength > 4000 || packetLength < 4) { m_log.Info("bad packet length: " + packetLength); m_inOffset = 0; return; } if (num_bytes > packetLength + 2) { m_log.Debug("more than needed received"); int remaining = num_bytes; while (remaining > 0) { m_log.DebugFormat("Remaining in overflow packet {0}", remaining); if (isDecrypted) { RealmPacketIn packet = new RealmPacketIn(m_inBuf, m_inOffset - remaining, packetLength + 2); TryHandlePacket(packet); remaining -= (packet.PacketSize + 2);//m_packetLength + 2; startOffset += (packet.PacketSize + 2); isDecrypted = false; } else { DecryptHeader(ref m_inBuf, startOffset); packetLength = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(m_inBuf, startOffset)); RealmPacketIn packet = new RealmPacketIn(m_inBuf, startOffset, packetLength + 2); TryHandlePacket(packet); remaining -= (packet.PacketSize + 2); startOffset += (packet.PacketSize + 2); //isDecrypted = false; } } m_inOffset = 0; // done return; } // received single message in packet if (packetLength + 2 == num_bytes) { // full message RealmPacketIn packet = new RealmPacketIn(m_inBuf, startOffset, packetLength + 2); TryHandlePacket(packet); m_inOffset = 0; return; } }