From 464e6cc343ed9dd6dd55364a1d33e6662eb71e7e Mon Sep 17 00:00:00 2001 From: yankejustin Date: Thu, 14 May 2015 13:39:29 -0400 Subject: [PATCH] Changes to AsyncReceive Improved a bit... See if it fixed https://github.com/MaxXor/xRAT/issues/131 --- Server/Core/Client.cs | 81 +++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 34 deletions(-) diff --git a/Server/Core/Client.cs b/Server/Core/Client.cs index 7bfd55c2..89ea32a0 100644 --- a/Server/Core/Client.cs +++ b/Server/Core/Client.cs @@ -146,47 +146,60 @@ namespace xServer.Core while (process) { - if (_receiveState == ReceiveType.Header) + switch (_receiveState) { - process = _readableDataLen >= HEADER_SIZE; - if (process) - { - _payloadLen = BitConverter.ToInt32(_buffer, _readOffset); - - _readableDataLen -= HEADER_SIZE; - _readOffset += HEADER_SIZE; - _receiveState = ReceiveType.Payload; - } - } - else if (_receiveState == ReceiveType.Payload) - { - process = _readableDataLen >= _payloadLen; - if (process) - { - byte[] payload = new byte[_payloadLen]; - Array.Copy(this._buffer, _readOffset, payload, 0, payload.Length); - - if (encryptionEnabled) - payload = AES.Decrypt(payload, Encoding.UTF8.GetBytes(XMLSettings.Password)); - - if (payload.Length > 0) + case ReceiveType.Header: { - if (compressionEnabled) - payload = new SafeQuickLZ().Decompress(payload, 0, payload.Length); - - using (MemoryStream deserialized = new MemoryStream(payload)) + process = _readableDataLen >= HEADER_SIZE; + if (process) { - IPacket packet = Serializer.DeserializeWithLengthPrefix(deserialized, - PrefixStyle.Fixed32); + _payloadLen = BitConverter.ToInt32(_buffer, _readOffset); - OnClientRead(packet); + _readableDataLen -= HEADER_SIZE; + _readOffset += HEADER_SIZE; + _receiveState = ReceiveType.Payload; } + break; } - _readOffset += _payloadLen; - _readableDataLen -= _payloadLen; - _receiveState = ReceiveType.Header; - } + case ReceiveType.Payload: + { + process = _readableDataLen >= _payloadLen; + if (process) + { + byte[] payload = new byte[_payloadLen]; + try + { + Array.Copy(this._buffer, _readOffset, payload, 0, payload.Length); + } + catch + { + Disconnect(); + } + + if (encryptionEnabled) + payload = AES.Decrypt(payload, Encoding.UTF8.GetBytes(XMLSettings.Password)); + + if (payload.Length > 0) + { + if (compressionEnabled) + payload = new SafeQuickLZ().Decompress(payload, 0, payload.Length); + + using (MemoryStream deserialized = new MemoryStream(payload)) + { + IPacket packet = Serializer.DeserializeWithLengthPrefix(deserialized, + PrefixStyle.Fixed32); + + OnClientRead(packet); + } + } + + _readOffset += _payloadLen; + _readableDataLen -= _payloadLen; + _receiveState = ReceiveType.Header; + } + break; + } } }