Exemplo n.º 1
0
        private async Task AcceptAsync(CancellationToken t)
        {
            logger.Site().Information("Accepting connections on {0}", ListenEndpoint);
            while (!t.IsCancellationRequested)
            {
                Socket             socket      = null;
                EpoxyNetworkStream epoxyStream = null;

                try
                {
                    socket = await listener.AcceptSocketAsync();

                    logger.Site().Debug("Accepted connection from {0}.", socket.RemoteEndPoint);

                    EpoxyTransport.ConfigureSocketKeepAlive(socket, timeoutConfig, logger);

                    epoxyStream = await EpoxyNetworkStream.MakeServerStreamAsync(socket, tlsConfig, logger);

                    socket = null; // epoxyStream now owns the socket

                    var connection = EpoxyConnection.MakeServerConnection(
                        parentTransport,
                        this,
                        serviceHost,
                        epoxyStream,
                        logger,
                        metrics);

                    // connection now owns the EpoxyNetworkStream
                    epoxyStream = null;

                    lock (connectionsLock)
                    {
                        connections.Add(connection);
                    }

                    await connection.StartAsync();

                    logger.Site().Debug("Started server-side connection for {0}", connection.RemoteEndPoint);
                }
                catch (AuthenticationException ex)
                {
                    logger.Site().Error(ex, "Failed to authenticate remote connection from {0}", socket?.RemoteEndPoint);
                    ShutdownSocketSafe(socket, epoxyStream);
                }
                catch (SocketException ex)
                {
                    logger.Site().Error(ex, "Accept failed with error {0}.", ex.SocketErrorCode);
                    ShutdownSocketSafe(socket, epoxyStream);
                }
                catch (ObjectDisposedException)
                {
                    ShutdownSocketSafe(socket, epoxyStream);
                }
            }

            logger.Site().Information("Shutting down connection on {0}", ListenEndpoint);
        }
Exemplo n.º 2
0
        async Task StartClientConnectionAsync(Socket socket)
        {
            EpoxyNetworkStream epoxyStream = null;

            try
            {
                EpoxyTransport.ConfigureSocketKeepAlive(socket, timeoutConfig, logger);

                epoxyStream = await EpoxyNetworkStream.MakeServerStreamAsync(socket, tlsConfig, logger);

                socket = null; // epoxyStream now owns the socket

                var connection = EpoxyConnection.MakeServerConnection(
                    parentTransport,
                    this,
                    serviceHost,
                    epoxyStream,
                    logger,
                    metrics);

                // connection now owns the EpoxyNetworkStream
                epoxyStream = null;

                lock (connectionsLock)
                {
                    connections.Add(connection);
                }

                logger.Site().Debug("Setup server-side connection for {0}. Starting Epoxy handshake.", connection.RemoteEndPoint);
                await connection.StartAsync();
            }
            catch (Exception)
            {
                ShutdownSocketSafe(socket, epoxyStream);
                throw;
            }
        }