示例#1
0
        public void TestPipeServerClient()
        {
            Until((port, done) =>
            {
                var server = new AsyncSocket();

                var socketA = new AsyncSocket();
                var socketB = new AsyncSocket();
                var portA   = port;
                var portB   = portA + 1;

                server.Listen(portA, socket => socket.Read(text =>
                {
                    Assert.AreEqual("Hello", text);
                    socket.Write("world!");
                }));

                socketB.Listen(portB, socket =>
                {
                    var c = new AsyncSocket();
                    c.Connect(Host, portB, () => SocketPipe.PipeSockets(socket, c));
                });

                socketA.Read(text =>
                {
                    Assert.AreEqual("world!", text);
                    done();
                });
                socketA.Connect(Host, portA, () => socketA.Write("Hello"));
            });
        }
示例#2
0
        public void TestPipeClients()
        {
            Until((port, done) =>
            {
                var serverA = new AsyncSocket();
                var serverB = new AsyncSocket();

                var socketA = new AsyncSocket();
                var socketB = new AsyncSocket();

                serverA.Listen(port, socket => socket.Read(text =>
                {
                    Assert.AreEqual("Hello", text);
                    socket.Write("world!");
                }));
                socketA.Connect(Host, port);

                serverB.Listen(port + 1, socket =>
                {
                    socket.Read(text =>
                    {
                        Assert.AreEqual("world!", text);
                        done();
                    });
                    socket.Write("Hello");
                });

                socketB.Connect(Host, port + 1, () => { });

                SocketPipe.PipeSockets(socketA, socketB);
            });
        }
示例#3
0
        public async ValueTask<StorageResponse> SendRequest<TRequest>(TRequest request)
            where TRequest : IStorageRequest
        {
            if (!_client.IsConnected)
            {
                _pipe = await SocketPipe.ConnectAsync(_host, _port).ConfigureAwait(false);
                _pipe.Log = Log;
                _client = new PipeHttpClient(_pipe);
            }
            request.Client = this;

            StorageResponse response = await _client.SendRequest<TRequest, StorageResponse>(request).ConfigureAwait(false);
            if (request.ConsumeBody) await ConsumeResponseBody(response.Body);
            return response;
        }
        private async Task ConnectAsync(CancellationToken cancellationToken)
        {
            if (IsConnected)
            {
                return;
            }

            LastAction = "Waiting for Connecting lock to be free";
            var wait = _connectSemaphoreSlim.WaitAsync(cancellationToken);

            if (!wait.IsCompletedSuccessfully())
            {
                await wait.ConfigureAwait(false);
            }

            try
            {
                if (IsConnected)
                {
                    return;
                }

                LastAction = "Connecting";
                Interlocked.Increment(ref _reconnectAttempts);

                _socket = new RedisSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                {
                    SendTimeout    = ClientConfig.SendTimeoutMillis,
                    ReceiveTimeout = ClientConfig.ReceiveTimeoutMillis
                };

                OptimiseSocket();

                if (IPAddress.TryParse(ClientConfig.Host, out var ip))
                {
                    await _socket.ConnectAsync(ip, ClientConfig.Port).ConfigureAwait(false);
                }
                else
                {
                    var addresses = await Dns.GetHostAddressesAsync(ClientConfig.Host);

                    await _socket.ConnectAsync(
                        addresses.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork),
                        ClientConfig.Port).ConfigureAwait(false);
                }


                if (!_socket.Connected)
                {
                    Log.Debug("Socket Connect failed");

                    _socket.Close();
                    _socket = null;
                    return;
                }

                Log.Debug("Socket Connected");

                Stream networkStream = new NetworkStream(_socket);

                var redisPipeOptions = GetPipeOptions();

                if (ClientConfig.Ssl)
                {
                    _sslStream = new SslStream(networkStream,
                                               false,
                                               ClientConfig.CertificateValidationCallback,
                                               ClientConfig.CertificateSelectionCallback,
                                               EncryptionPolicy.RequireEncryption);

                    LastAction = "Authenticating SSL Stream as Client";
                    await _sslStream.AuthenticateAsClientAsync(ClientConfig.Host).ConfigureAwait(false);

                    if (!_sslStream.IsEncrypted)
                    {
                        Dispose();
                        throw new SecurityException($"Could not establish an encrypted connection to Redis - {ClientConfig.Host}");
                    }

                    LastAction = "Creating SSL Stream Pipe";
                    _pipe      = StreamPipe.GetDuplexPipe(_sslStream, redisPipeOptions.SendOptions, redisPipeOptions.ReceiveOptions);
                }
                else
                {
                    LastAction = "Creating Socket Pipe";
                    _pipe      = SocketPipe.GetDuplexPipe(_socket, redisPipeOptions.SendOptions, redisPipeOptions.ReceiveOptions);
                }

                IsConnected = true;

                if (!string.IsNullOrEmpty(ClientConfig.Password))
                {
                    LastAction = "Authorizing";
                    await Authorize(cancellationToken);
                }

                if (ClientConfig.Db != 0)
                {
                    LastAction = "Selecting Database";
                    await SelectDb(cancellationToken);
                }

                if (ClientConfig.ClientName != null)
                {
                    LastAction = "Setting Client Name";
                    await SetClientNameAsync(cancellationToken);
                }
            }
            finally
            {
                _connectSemaphoreSlim.Release();
            }
        }