コード例 #1
0
 public TcpPipeChannel(Socket socket, IPipelineFilter <TPackageInfo> pipelineFilter, ChannelOptions options)
     : base(pipelineFilter, options)
 {
     _socket        = socket;
     RemoteEndPoint = socket.RemoteEndPoint;
     LocalEndPoint  = socket.LocalEndPoint;
 }
コード例 #2
0
        private void ReaderBuffer(ReadOnlySequence <byte> buffer, out SequencePosition consumed, out SequencePosition examined)
        {
            consumed = buffer.Start;
            examined = buffer.End;

            var seqReader             = new SequenceReader <byte>(buffer);
            var currentPipelineFilter = _pipelineFilter;

            var packageInfo = currentPipelineFilter.Filter(ref seqReader);

            if (currentPipelineFilter.NextFilter != null)
            {
                _pipelineFilter = currentPipelineFilter.NextFilter;
            }

            // continue receive...
            if (packageInfo == null)
            {
                return;
            }

            currentPipelineFilter.Reset();
            // already get a package
            OnPackageReceived(packageInfo);

            if (seqReader.End) // no more data
            {
                consumed = buffer.End;
            }
            else
            {
                examined = consumed = seqReader.Position;
            }
        }
コード例 #3
0
ファイル: PipeChannel.cs プロジェクト: xiaohszx/SuperSocket
 protected PipeChannel(IPipelineFilter <TPackageInfo> pipelineFilter, ChannelOptions options, ILogger logger)
 {
     _pipelineFilter = pipelineFilter;
     Options         = options;
     Logger          = logger;
     Output          = new Pipe();
 }
コード例 #4
0
        public WebSocketPackage Filter(ref SequenceReader <byte> reader)
        {
            var terminatorSpan = _headerTerminator.Span;

            if (!reader.TryReadToAny(out ReadOnlySequence <byte> pack, terminatorSpan, advancePastDelimiter: false))
            {
                return(null);
            }

            for (var i = 0; i < terminatorSpan.Length - 1; i++)
            {
                if (!reader.IsNext(terminatorSpan, advancePast: true))
                {
                    return(null);
                }
            }

            var header = ParseHttpHeaderItems(pack);

            var package = new WebSocketPackage
            {
                HttpHeader = header,
                OpCode     = OpCode.Handshake
            };

            NextFilter = new WebSocketDataPipelineFilter();
            return(package);
        }
コード例 #5
0
 /// <summary>
 /// 初始化Udp管道
 /// </summary>
 /// <param name="socket">Socket通道</param>
 /// <param name="pipelineFilter">管道筛选器</param>
 /// <param name="options">选项</param>
 /// <param name="remoteEndPoint">远程网络标识</param>
 /// <param name="sessionIdentifier">Session标识符</param>
 public UdpPipeChannel(Socket socket, IPipelineFilter <TPackageInfo> pipelineFilter, ChannelOptions options, IPEndPoint remoteEndPoint, string sessionIdentifier)
     : base(pipelineFilter, options)
 {
     _socket           = socket;
     _remoteEndPoint   = remoteEndPoint;
     SessionIdentifier = sessionIdentifier;
 }
コード例 #6
0
ファイル: PipeChannel.cs プロジェクト: yangan666/SuperSocket
 protected PipeChannel(IPipelineFilter <TPackageInfo> pipelineFilter, ChannelOptions options)
 {
     _pipelineFilter = pipelineFilter;
     Options         = options;
     Logger          = options.Logger;
     Out             = options.Out ?? new Pipe();
     In = options.In ?? new Pipe();
 }
コード例 #7
0
 public UdpPipeChannel(Socket socket, IPipelineFilter <TPackageInfo> pipelineFilter, ChannelOptions options, IPEndPoint remoteEndPoint, string sessionIdentifier)
     : base(pipelineFilter, options)
 {
     _socket            = socket;
     _enableSendingPipe = "true".Equals(options.Values?["enableSendingPipe"], StringComparison.OrdinalIgnoreCase);
     RemoteEndPoint     = remoteEndPoint;
     SessionIdentifier  = sessionIdentifier;
 }
コード例 #8
0
 protected PipeChannel(IPipelineFilter <TPackageInfo> pipelineFilter, ChannelOptions options)
 {
     _pipelineFilter    = pipelineFilter;
     _packageTaskSource = new ManualResetValueTaskSourceCore <TPackageInfo>();
     Options            = options;
     Logger             = options.Logger;
     Out = options.Out ?? new Pipe();
     In  = options.In ?? new Pipe();
 }
コード例 #9
0
 protected PipeChannel(IPipelineFilter <TPackageInfo> pipelineFilter, ChannelOptions options)
 {
     _oriPipelineFilter = pipelineFilter;
     _pipelineFilter    = pipelineFilter;
     _packagePipe       = new DefaultObjectPipe <TPackageInfo>();
     Options            = options;
     Logger             = options.Logger;
     Out = options.Out ?? new Pipe();
     In  = options.In ?? new Pipe();
 }
コード例 #10
0
        private bool ReaderBuffer(ReadOnlySequence <byte> buffer, out SequencePosition consumed, out SequencePosition examined)
        {
            consumed = buffer.Start;
            examined = buffer.End;

            var maxPackageLength = Options.MaxPackageLength;

            var seqReader = new SequenceReader <byte>(buffer);

            while (true)
            {
                var currentPipelineFilter = _pipelineFilter;

                var packageInfo = currentPipelineFilter.Filter(ref seqReader);

                if (currentPipelineFilter.NextFilter != null)
                {
                    _pipelineFilter = currentPipelineFilter.NextFilter;
                }

                var pos = seqReader.Position.GetInteger();

                if (maxPackageLength > 0 && pos > maxPackageLength)
                {
                    Logger.LogError($"Package cannot be larger than {maxPackageLength}.");
                    // close the the connection directly
                    Close();
                    _packageTaskSource.SetResult(null);
                    return(false);
                }

                // continue receive...
                if (packageInfo == null)
                {
                    return(true);
                }

                currentPipelineFilter.Reset();

                _packageTaskSource.SetResult(packageInfo);
                _packageTaskSource.Reset();

                if (seqReader.End) // no more data
                {
                    consumed = buffer.End;
                    break;
                }
                else
                {
                    examined = consumed = seqReader.Position;
                }
            }

            return(true);
        }
コード例 #11
0
        public override async Task ProcessRequest()
        {
            var input = Pipe.Input;

            var currentPipelineFilter = _pipelineFilter;

            while (true)
            {
                var result = await input.ReadAsync();

                var buffer = result.Buffer;

                try
                {
                    if (result.IsCompleted)
                    {
                        OnClosed();
                        break;
                    }

                    while (true)
                    {
                        var packageInfo = currentPipelineFilter.Filter(ref buffer);

                        if (currentPipelineFilter.NextFilter != null)
                        {
                            _pipelineFilter = currentPipelineFilter = currentPipelineFilter.NextFilter;
                        }

                        // continue receive...
                        if (packageInfo == null)
                        {
                            break;
                        }

                        // already get a package
                        OnPackageReceived(packageInfo);

                        if (buffer.Length == 0) // no more data
                        {
                            break;
                        }
                    }
                }
                finally
                {
                    input.AdvanceTo(buffer.Start, buffer.End);
                }
            }

            await Task.CompletedTask;
        }
コード例 #12
0
        /// <summary>
        /// Initializes a new instance of the <see cref="LiveCharts_co_uk_PriceReceiver"/> class.
        /// </summary>
        /// <param name="scraper">The scraper.</param>
        /// <param name="stockMarket">The stock market.</param>
        /// <param name="filter">The filter.</param>
        /// <param name="timePeriodLengthSecs">The time period length secs.</param>
        public LiveCharts_co_uk_PriceReceiver(IScraper scraper, IStockMarket stockMarket, IPipelineFilter filter, int timePeriodLengthSecs)
            : this()
        {
            Condition.Requires(scraper).IsNotNull();
            Condition.Requires(stockMarket).IsNotNull();
            Condition.Requires(timePeriodLengthSecs).IsGreaterThan(0);

            this._scraper     = scraper;
            this._stockMarket = stockMarket;
            this._filter      = filter;

            this._timePeriodLengthSecs = timePeriodLengthSecs;
        }
コード例 #13
0
        protected async Task ReadPipeAsync(PipeReader reader)
        {
            var currentPipelineFilter = _pipelineFilter;

            while (true)
            {
                var result = await reader.ReadAsync();

                var buffer = result.Buffer;

                try
                {
                    if (result.IsCompleted)
                    {
                        OnClosed();
                        break;
                    }

                    while (true)
                    {
                        var packageInfo = currentPipelineFilter.Filter(ref buffer);

                        if (currentPipelineFilter.NextFilter != null)
                        {
                            _pipelineFilter = currentPipelineFilter = currentPipelineFilter.NextFilter;
                        }

                        // continue receive...
                        if (packageInfo == null)
                        {
                            break;
                        }

                        // already get a package
                        OnPackageReceived(packageInfo);

                        if (buffer.Length == 0) // no more data
                        {
                            break;
                        }
                    }
                }
                finally
                {
                    reader.AdvanceTo(buffer.Start, buffer.End);
                }
            }

            reader.Complete();
        }
コード例 #14
0
        /// <summary>
        /// 创建通道
        /// </summary>
        /// <typeparam name="TReceivePackage">接收包</typeparam>
        /// <param name="pipelineFilter">内置命令行</param>
        /// <param name="channelOptions">通道设置</param>
        /// <returns>Stream/Tcp通道</returns>
        public IChannel <TReceivePackage> CreateChannel <TReceivePackage>(IPipelineFilter <TReceivePackage> pipelineFilter, ChannelOptions channelOptions)
            where TReceivePackage : class
        {
            var stream = this.Stream;
            var socket = this.Socket;

            if (stream != null)
            {
                return(new StreamPipeChannel <TReceivePackage>(stream, socket.RemoteEndPoint, socket.LocalEndPoint, pipelineFilter, channelOptions));
            }
            else
            {
                return(new TcpPipeChannel <TReceivePackage>(socket, pipelineFilter, channelOptions));
            }
        }
コード例 #15
0
        public override async Task ProcessRequest()
        {
            var input = PipeConnection.Input;

            //var consumed = new ReadCursor();
            //var examined = new ReadCursor();

            var currentPipelineFilter = _pipelineFilter;

            while (true)
            {
                var result = await input.ReadAsync();

                if (result.IsCompleted)
                {
                    OnClosed();
                    break;
                }

                var buffer = result.Buffer;

                while (true)
                {
                    var packageInfo = currentPipelineFilter.Filter(ref buffer);

                    if (currentPipelineFilter.NextFilter != null)
                    {
                        _pipelineFilter = currentPipelineFilter = currentPipelineFilter.NextFilter;
                    }

                    // continue receive...
                    if (packageInfo == null)
                    {
                        break;
                    }

                    // already get a package
                    OnPackageReceived(packageInfo);

                    if (buffer.Length == 0) // no more data
                    {
                        break;
                    }
                }
            }

            await Task.CompletedTask;
        }
コード例 #16
0
        public WebSocketPackage Filter(ref SequenceReader <byte> reader)
        {
            var terminatorSpan = _headerTerminator.Span;

            if (!reader.TryReadTo(out ReadOnlySequence <byte> pack, terminatorSpan, advancePastDelimiter: false))
            {
                return(null);
            }

            reader.Advance(terminatorSpan.Length);

            var package = ParseHandshake(ref pack);

            NextFilter = new WebSocketDataPipelineFilter(package.HttpHeader);

            return(package);
        }
コード例 #17
0
ファイル: PipeChannel.cs プロジェクト: ypeng-ming/SuperSocket
        protected PipeChannel(IPipelineFilter <TPackageInfo> pipelineFilter, ChannelOptions options)
        {
            _pipelineFilter = pipelineFilter;

            if (!options.ReadAsDemand)
            {
                _packagePipe = new DefaultObjectPipe <TPackageInfo>();
            }
            else
            {
                _packagePipe = new DefaultObjectPipeWithSupplyControl <TPackageInfo>();
            }

            Options = options;
            Logger  = options.Logger;
            Out     = options.Out ?? new Pipe();
            In      = options.In ?? new Pipe();
        }
コード例 #18
0
ファイル: PipeChannel.cs プロジェクト: zqlovejyc/SuperSocket
        private bool ReaderBuffer(ref ReadOnlySequence <byte> buffer, out SequencePosition consumed, out SequencePosition examined)
        {
            consumed = buffer.Start;
            examined = buffer.End;

            var bytesConsumedTotal = 0L;

            var maxPackageLength = Options.MaxPackageLength;

            var seqReader = new SequenceReader <byte>(buffer);

            while (true)
            {
                var currentPipelineFilter = _pipelineFilter;

                var packageInfo = currentPipelineFilter.Filter(ref seqReader);

                var nextFilter = currentPipelineFilter.NextFilter;

                if (nextFilter != null)
                {
                    nextFilter.Context = currentPipelineFilter.Context; // pass through the context
                    _pipelineFilter    = nextFilter;
                }

                var bytesConsumed = seqReader.Consumed;
                bytesConsumedTotal += bytesConsumed;

                var len = bytesConsumed;

                // nothing has been consumed, need more data
                if (len == 0)
                {
                    len = seqReader.Length;
                }

                if (maxPackageLength > 0 && len > maxPackageLength)
                {
                    Logger.LogError($"Package cannot be larger than {maxPackageLength}.");
                    // close the the connection directly
                    Close();
                    return(false);
                }

                // continue receive...
                if (packageInfo == null)
                {
                    consumed = buffer.GetPosition(bytesConsumedTotal);
                    return(true);
                }

                currentPipelineFilter.Reset();

                _packagePipe.Write(packageInfo);

                if (seqReader.End) // no more data
                {
                    examined = consumed = buffer.End;
                    return(true);
                }

                seqReader = new SequenceReader <byte>(seqReader.Sequence.Slice(bytesConsumed));
            }
        }
コード例 #19
0
ファイル: EasyClient.cs プロジェクト: inrg/SuperSocket
 public EasyClient(IPipelineFilter <TPackage> pipelineFilter, Func <TPackage, Task> handler, IPackageEncoder <TPackage> packageEncoder = null, ILogger logger = null)
     : base(pipelineFilter, handler, packageEncoder, logger)
 {
 }
コード例 #20
0
        public override IEasyClient <TPackageInfo> ConfigureEasyClient <TPackageInfo>(IPipelineFilter <TPackageInfo> pipelineFilter, ChannelOptions options) where TPackageInfo : class
        {
            var client = new EasyClient <TPackageInfo>(pipelineFilter, options);

            client.Security = new SecurityOptions
            {
                TargetHost          = "supersocket",
                EnabledSslProtocols = GetClientEnabledSslProtocols(),
                RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true
            };
            return(client);
        }
コード例 #21
0
 /// <summary>
 /// Sets the filter for the pipeline, where the user can add/remove or change handlers.
 /// </summary>
 public ChannelClientConfiguration SetPipelineFilter(IPipelineFilter pipelineFilter)
 {
     PipelineFilter = pipelineFilter;
     return this;
 }
コード例 #22
0
 public TcpPipeChannel(Socket socket, IPipelineFilter pipelineFilter)
     : base(pipelineFilter)
 {
     _socket = socket;
 }
コード例 #23
0
 /// <summary>
 /// Sets the filter for the pipeline, where the user can add, remove or change filters.
 /// </summary>
 /// <returns></returns>
 public ChannelServerConfiguration SetPipelineFilter(IPipelineFilter pipelineFilter)
 {
     _pipelineFilter = pipelineFilter;
     return this;
 }
コード例 #24
0
ファイル: StreamPipeChannel.cs プロジェクト: mehome/UnionIOV
 public StreamPipeChannel(Stream stream, EndPoint remoteEndPoint, IPipelineFilter <TPackageInfo> pipelineFilter, ChannelOptions options)
     : this(stream, remoteEndPoint, null, pipelineFilter, options)
 {
 }
コード例 #25
0
 /// <summary>
 /// Sets the filter for the pipeline, where the user can add/remove or change handlers.
 /// </summary>
 public ChannelClientConfiguration SetPipelineFilter(IPipelineFilter pipelineFilter)
 {
     PipelineFilter = pipelineFilter;
     return(this);
 }
コード例 #26
0
 public SecureEasyClient(IPipelineFilter <TReceivePackage> pipelineFilter, ChannelOptions options)
     : base(pipelineFilter, options)
 {
 }
コード例 #27
0
 public EasyClient(IPipelineFilter <TPackage> pipelineFilter, IPackageEncoder <TSendPackage> packageEncoder, ChannelOptions options)
     : base(pipelineFilter, options)
 {
     _packageEncoder = packageEncoder;
 }
コード例 #28
0
 public EasyClient(IPipelineFilter <TPackage> pipelineFilter, IPackageEncoder <TSendPackage> packageEncoder = null, ILogger logger = null)
     : base(pipelineFilter, logger)
 {
     _packageEncoder = packageEncoder;
 }
コード例 #29
0
 public EasyClient(IPipelineFilter <TPackage> pipelineFilter, IPackageEncoder <TSendPackage> packageEncoder, ILogger logger = null)
     : this(pipelineFilter, packageEncoder, new ChannelOptions {
     Logger = logger
 })
 {
 }
コード例 #30
0
ファイル: StreamPipeChannel.cs プロジェクト: mehome/UnionIOV
 public StreamPipeChannel(Stream stream, EndPoint remoteEndPoint, EndPoint localEndPoint, IPipelineFilter <TPackageInfo> pipelineFilter, ChannelOptions options)
     : base(pipelineFilter, options)
 {
     _stream        = stream;
     RemoteEndPoint = remoteEndPoint;
     LocalEndPoint  = localEndPoint;
     StartTasks();
 }
コード例 #31
0
 public SerialIOPipeChannel(SerialPort serialPort, IPipelineFilter <TPackageInfo> pipelineFilter, ChannelOptions options)
     : base(pipelineFilter, options)
 {
     _serialPort = serialPort;
 }
コード例 #32
0
 public SecureEasyClient(IPipelineFilter <TReceivePackage> pipelineFilter, ILogger logger)
     : this(pipelineFilter, new ChannelOptions {
     Logger = logger
 })
 {
 }