void PipeUdp(IClient localClient, IClient targetClient, Cipher.IShadowsocksStreamCipher cipher, CancellationToken cancellationToken, params PipeFilter[] addFilters)
        {
            DefaultPipe p = new DefaultPipe(targetClient, localClient, 1500, _logger);

            p.OnBroken += Pipe_OnBroken;

            Cipher.CipherUdpFilter      filterLocal1  = new Cipher.CipherUdpFilter(localClient, cipher, _logger);
            RemoteUdpRelayPackingFilter filterTarget1 = new RemoteUdpRelayPackingFilter(targetClient, _logger);

            p.ApplyFilter(filterLocal1).ApplyFilter(filterTarget1);
            if (addFilters.Length > 0)
            {
                p.ApplyFilter(addFilters);
            }

            lock (_pipesReadWriteLock)
            {
                this._pipes.Add(p);
            }
            p.Pipe();
        }
        void PipeTcp(IClient localClient, IClient targetClient, Cipher.IShadowsocksStreamCipher cipher, CancellationToken cancellationToken, params PipeFilter[] addFilters)
        {
            DefaultPipe p = new DefaultPipe(localClient, targetClient, Defaults.ReceiveBufferSize, _logger);

            p.OnBroken += Pipe_OnBroken;

            Cipher.CipherTcpFilter filter1 = new Cipher.CipherTcpFilter(localClient, cipher, _logger);

            p.ApplyFilter(filter1);

            //if (addFilters.Length > 0)
            //{
            //    foreach (var f in addFilters)
            //    {
            //        p.ApplyFilter(f);
            //    }
            //}
            lock (_pipesReadWriteLock)
            {
                this._pipes.Add(p);
            }
            p.Pipe();
        }