internal SocketConnection(Socket socket, MemoryPool <byte> memoryPool, PipeScheduler scheduler, ISocketsTrace trace)
        {
            Debug.Assert(socket != null);
            Debug.Assert(memoryPool != null);
            Debug.Assert(trace != null);

            _socket    = socket;
            MemoryPool = memoryPool;
            _scheduler = scheduler;
            _trace     = trace;

            var localEndPoint  = (IPEndPoint)_socket.LocalEndPoint;
            var remoteEndPoint = (IPEndPoint)_socket.RemoteEndPoint;

            LocalAddress = localEndPoint.Address;
            LocalPort    = localEndPoint.Port;

            RemoteAddress = remoteEndPoint.Address;
            RemotePort    = remoteEndPoint.Port;

            ConnectionClosed = _connectionClosedTokenSource.Token;

            // On *nix platforms, Sockets already dispatches to the ThreadPool.
            // Yes, the IOQueues are still used for the PipeSchedulers. This is intentional.
            // https://github.com/aspnet/KestrelHttpServer/issues/2573
            var awaiterScheduler = IsWindows ? _scheduler : PipeScheduler.Inline;

            _receiver = new SocketReceiver(_socket, awaiterScheduler);
            _sender   = new SocketSender(_socket, awaiterScheduler);
        }
        internal SocketConnection(Socket socket, MemoryPool <byte> memoryPool, PipeScheduler scheduler, ISocketsTrace trace)
        {
            Debug.Assert(socket != null);
            Debug.Assert(memoryPool != null);
            Debug.Assert(trace != null);

            _socket    = socket;
            MemoryPool = memoryPool;
            _scheduler = scheduler;
            _trace     = trace;

            var localEndPoint  = (IPEndPoint)_socket.LocalEndPoint;
            var remoteEndPoint = (IPEndPoint)_socket.RemoteEndPoint;

            LocalAddress = localEndPoint.Address;
            LocalPort    = localEndPoint.Port;

            RemoteAddress = remoteEndPoint.Address;
            RemotePort    = remoteEndPoint.Port;

            // On *nix platforms, Sockets already dispatches to the ThreadPool.
            var awaiterScheduler = IsWindows ? _scheduler : PipeScheduler.Inline;

            _receiver = new SocketReceiver(_socket, awaiterScheduler);
            _sender   = new SocketSender(_socket, awaiterScheduler);
        }
        internal SocketConnection(Socket socket, MemoryPool <byte> memoryPool, PipeScheduler scheduler, ISocketsTrace trace)
        {
            Debug.Assert(socket != null);
            Debug.Assert(memoryPool != null);
            Debug.Assert(trace != null);

            _socket    = socket;
            MemoryPool = memoryPool;
            _scheduler = scheduler;
            _trace     = trace;

            var localEndPoint  = (IPEndPoint)_socket.LocalEndPoint;
            var remoteEndPoint = (IPEndPoint)_socket.RemoteEndPoint;

            LocalAddress = localEndPoint.Address;
            LocalPort    = localEndPoint.Port;

            RemoteAddress = remoteEndPoint.Address;
            RemotePort    = remoteEndPoint.Port;

            ConnectionClosed = _connectionClosedTokenSource.Token;

            _receiver = new SocketReceiver(_socket, _scheduler);
            _sender   = new SocketSender(_socket, _scheduler);
        }
Example #4
0
        internal SocketConnection(Socket socket,
                                  MemoryPool <byte> memoryPool,
                                  PipeScheduler transportScheduler,
                                  ISocketsTrace trace,
                                  long?maxReadBufferSize   = null,
                                  long?maxWriteBufferSize  = null,
                                  bool waitForData         = true,
                                  bool useInlineSchedulers = false)
        {
            Debug.Assert(socket != null);
            Debug.Assert(memoryPool != null);
            Debug.Assert(trace != null);

            _socket      = socket;
            MemoryPool   = memoryPool;
            _trace       = trace;
            _waitForData = waitForData;

            LocalEndPoint  = _socket.LocalEndPoint;
            RemoteEndPoint = _socket.RemoteEndPoint;

            ConnectionClosed = _connectionClosedTokenSource.Token;

            // On *nix platforms, Sockets already dispatches to the ThreadPool.
            // Yes, the IOQueues are still used for the PipeSchedulers. This is intentional.
            // https://github.com/aspnet/KestrelHttpServer/issues/2573
            var awaiterScheduler = IsWindows ? transportScheduler : PipeScheduler.Inline;

            var applicationScheduler = PipeScheduler.ThreadPool;

            if (useInlineSchedulers)
            {
                transportScheduler   = PipeScheduler.Inline;
                awaiterScheduler     = PipeScheduler.Inline;
                applicationScheduler = PipeScheduler.Inline;
            }

            _receiver = new SocketReceiver(_socket, awaiterScheduler);
            _sender   = new SocketSender(_socket, awaiterScheduler);

            maxReadBufferSize ??= 0;
            maxWriteBufferSize ??= 0;

            var inputOptions  = new PipeOptions(MemoryPool, applicationScheduler, transportScheduler, maxReadBufferSize.Value, maxReadBufferSize.Value / 2, useSynchronizationContext: false);
            var outputOptions = new PipeOptions(MemoryPool, transportScheduler, applicationScheduler, maxWriteBufferSize.Value, maxWriteBufferSize.Value / 2, useSynchronizationContext: false);

            var pair = DuplexPipe.CreateConnectionPair(inputOptions, outputOptions);

            // Set the transport and connection id
            Transport   = pair.Transport;
            Application = pair.Application;
        }
        internal SocketConnection(Socket socket, MemoryPool memoryPool, ISocketsTrace trace)
        {
            Debug.Assert(socket != null);
            Debug.Assert(memoryPool != null);
            Debug.Assert(trace != null);

            _socket    = socket;
            MemoryPool = memoryPool;
            _trace     = trace;

            var localEndPoint  = (IPEndPoint)_socket.LocalEndPoint;
            var remoteEndPoint = (IPEndPoint)_socket.RemoteEndPoint;

            LocalAddress = localEndPoint.Address;
            LocalPort    = localEndPoint.Port;

            RemoteAddress = remoteEndPoint.Address;
            RemotePort    = remoteEndPoint.Port;

            _receiver = new SocketReceiver(_socket);
            _sender   = new SocketSender(_socket);
        }
Example #6
0
        internal SocketConnection(Socket socket, PipeFactory pipeFactory, ISocketsTrace trace)
        {
            Debug.Assert(socket != null);
            Debug.Assert(pipeFactory != null);
            Debug.Assert(trace != null);

            _socket     = socket;
            PipeFactory = pipeFactory;
            _trace      = trace;

            var localEndPoint  = (IPEndPoint)_socket.LocalEndPoint;
            var remoteEndPoint = (IPEndPoint)_socket.RemoteEndPoint;

            LocalAddress = localEndPoint.Address;
            LocalPort    = localEndPoint.Port;

            RemoteAddress = remoteEndPoint.Address;
            RemotePort    = remoteEndPoint.Port;

            _receiver = new SocketReceiver(_socket);
            _sender   = new SocketSender(_socket);
        }
Example #7
0
        internal SocketConnection(Socket socket,
                                  MemoryPool <byte> memoryPool,
                                  PipeScheduler transportScheduler,
                                  ISocketsTrace trace,
                                  PipeOptions inputOptions,
                                  PipeOptions outputOptions,
                                  bool waitForData = true)
        {
            Debug.Assert(socket != null);
            Debug.Assert(memoryPool != null);
            Debug.Assert(trace != null);

            _socket      = socket;
            MemoryPool   = memoryPool;
            _trace       = trace;
            _waitForData = waitForData;

            LocalEndPoint  = _socket.LocalEndPoint;
            RemoteEndPoint = _socket.RemoteEndPoint;

            ConnectionClosed = _connectionClosedTokenSource.Token;

            // On *nix platforms, Sockets already dispatches to the ThreadPool.
            // Yes, the IOQueues are still used for the PipeSchedulers. This is intentional.
            // https://github.com/aspnet/KestrelHttpServer/issues/2573
            var awaiterScheduler = OperatingSystem.IsWindows() ? transportScheduler : PipeScheduler.Inline;

            _receiver = new SocketReceiver(_socket, awaiterScheduler);
            _sender   = new SocketSender(_socket, awaiterScheduler);

            var pair = DuplexPipe.CreateConnectionPair(inputOptions, outputOptions);

            // Set the transport and connection id
            Transport   = _originalTransport = pair.Transport;
            Application = pair.Application;
        }