Example #1
0
        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();
            }
        }
Example #2
0
 protected abstract TSession InitiateSession(SecurableConnection connection, EndPoint local, EndPoint remote);