public async Task Start(CancellationToken cancellationToken) { TcpListener[] listeners = _ports .Select(p => new TcpListener(IPAddress.Any, p)) .ToArray(); foreach (var l in listeners) { l.Start(); } Task <TcpClient>[] tasks = listeners.Select(tcp => tcp.AcceptTcpClientAsync()) .ToArray(); while (!cancellationToken.IsCancellationRequested) { int taskCompleted = Task.WaitAny(tasks); TcpClient client = tasks[taskCompleted].Result; using (await SemaphoreLock.GetLockAsync(_sessionSemaphore, cancellationToken)) { var securableConnection = new SecurableConnection(client.GetStream()); securableConnection.Certificate = ServerCertificate; var session = InitiateSession( securableConnection, client.Client.LocalEndPoint, client.Client.RemoteEndPoint); _sessions.Add(session); _sessionLifetimes.Add(session.Start(cancellationToken)); } // Wait for another connection tasks[taskCompleted] = listeners[taskCompleted].AcceptTcpClientAsync(); } foreach (var l in listeners) { l.Stop(); } }
protected abstract TSession InitiateSession(SecurableConnection connection, EndPoint local, EndPoint remote);