PeerCastStation.FLV.RTMP.RTMPSourceConnection.DoConnect C# (CSharp) Method

DoConnect() protected method

protected DoConnect ( Uri source, CancellationToken cancellationToken ) : Task
source System.Uri
cancellationToken System.Threading.CancellationToken
return Task
    protected override async Task<SourceConnectionClient> DoConnect(Uri source, CancellationToken cancellationToken)
    {
      TcpClient client = null;
      var bind_addr = GetBindAddresses(source);
      if (bind_addr.Count()==0) {
        this.state = ConnectionState.Error;
        throw new BindErrorException(String.Format("Cannot resolve bind address: {0}", source.DnsSafeHost));
      }
      var listeners = bind_addr.Select(addr => new TcpListener(addr)).ToArray();
      try {
        var cancel_task = cancellationToken.CreateCancelTask<TcpClient>();
        var tasks = listeners.Select(listener => {
          listener.Start(1);
          Logger.Debug("Listening on {0}", listener.LocalEndpoint);
          return listener.AcceptTcpClientAsync();
        }).Concat(Enumerable.Repeat(cancel_task, 1)).ToArray();
        var result = await Task.WhenAny(tasks);
        if (!result.IsCanceled) {
          client = result.Result;
          Logger.Debug("Client accepted");
        }
        else {
          Logger.Debug("Listen cancelled");
        }
      }
      catch (SocketException) {
        this.state = ConnectionState.Error;
        throw new BindErrorException(String.Format("Cannot bind address: {0}", bind_addr));
      }
      finally {
        foreach (var listener in listeners) {
          listener.Stop();
        }
      }
      if (client!=null) {
        return new SourceConnectionClient(client);
      }
      else {
        return null;
      }
    }