Akka.Interfaced.SlimSocket.Server.TcpConnection.TryDeserializeNormalPacket C# (CSharp) Метод

TryDeserializeNormalPacket() приватный Метод

private TryDeserializeNormalPacket ( int len ) : bool
len int
Результат bool
        private bool TryDeserializeNormalPacket(int len)
        {
            _receiveLength += len;

            var stream = new MemoryStream(_receiveBuffer, 0, _receiveLength, false, true);
            var readOffset = 0;
            while (true)
            {
                var packetLen = Settings.PacketSerializer.PeekLength(stream);
                if (packetLen == 0 || _receiveLength - readOffset < packetLen)
                {
                    // 패킷 크기가 최대 크기보다 큰지 확인
                    if (packetLen > Settings.ReceiveBufferMaxSize)
                    {
                        HandleSerializeError(SerializeError.DeserializeSizeExceeded);
                        return false;
                    }

                    _receiveLength -= readOffset;

                    if (packetLen > _receiveBuffer.Length)
                    {
                        // 패킷이 기본 버퍼보다 크기가 크면 Large 모드 전환

                        _receiveLargeBuffer = new ArraySegment<byte>(new byte[packetLen]);
                        _receiveLargeLength = _receiveLength;
                        Array.Copy(_receiveBuffer, readOffset,
                                   _receiveLargeBuffer.Value.Array,
                                   _receiveLargeBuffer.Value.Offset,
                                   _receiveLength);
                    }
                    else if (_receiveLength > 0)
                    {
                        // 버퍼에 남은 데이터가 있으면 맨 앞으로 이동

                        Array.Copy(_receiveBuffer, readOffset,
                                   _receiveBuffer, 0, _receiveLength);
                    }

                    break;
                }

                // 버퍼에서 패킷 재구성해내기

                object packet;
                try
                {
                    packet = Settings.PacketSerializer.Deserialize(stream);
                }
                catch (Exception e)
                {
                    if (_logger != null)
                    {
                        var bytes = Convert.ToBase64String(_receiveBuffer, 0, Math.Min(_receiveLength, 2048));
                        _logger.WarnFormat("Exception raised in deserializing: " + bytes, e);
                    }
                    HandleSerializeError(SerializeError.DeserializeExceptionRaised);
                    return false;
                }
                if (packet == null)
                {
                    HandleSerializeError(SerializeError.DeserializeNoPacket);
                    return false;
                }

                _lastReceiveTime = DateTime.UtcNow;
                if (Received != null)
                    Received(this, packet);

                readOffset += packetLen;
            }

            return true;
        }