public async ValueTask <ConnectionContext> ConnectAsync(EndPoint endpoint, CancellationToken cancellationToken) { var socket = new Socket(SocketType.Stream, ProtocolType.Tcp) { LingerState = new LingerOption(true, 0), NoDelay = true }; socket.EnableFastPath(); var completion = new SingleUseSocketAsyncEventArgs { RemoteEndPoint = endpoint }; if (!socket.ConnectAsync(completion)) { completion.Complete(); } await completion; if (completion.SocketError != SocketError.Success) { throw new SocketConnectionException($"Unable to connect to {endpoint}. Error: {completion.SocketError}"); } var scheduler = this.schedulers.GetScheduler(); var connection = new SocketConnection(socket, this.memoryPool, scheduler, this.trace); connection.Start(); return(connection); }
public async ValueTask <ConnectionContext> ConnectAsync(EndPoint endpoint, CancellationToken cancellationToken) { var socket = new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp) { LingerState = new LingerOption(true, 0), NoDelay = true }; socket.EnableFastPath(); using var completion = new SingleUseSocketAsyncEventArgs { RemoteEndPoint = endpoint }; if (socket.ConnectAsync(completion)) { using (cancellationToken.Register(s => Socket.CancelConnectAsync((SingleUseSocketAsyncEventArgs)s), completion)) { await completion.Task; } } if (completion.SocketError != SocketError.Success) { if (completion.SocketError == SocketError.OperationAborted) { cancellationToken.ThrowIfCancellationRequested(); } throw new SocketConnectionException($"Unable to connect to {endpoint}. Error: {completion.SocketError}"); } var scheduler = this.schedulers.GetScheduler(); var connection = new SocketConnection(socket, this.memoryPool, scheduler, this.trace); connection.Start(); return(connection); }