/// <inheritdoc />
        public async Task <IPasvListener> CreateTcpListenerAsync(
            IFtpConnection connection,
            AddressFamily?addressFamily,
            int port,
            CancellationToken cancellationToken)
        {
            IPasvListener listener;

            if (port < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(port), "may not be less than 0");
            }

            var pasvOptions = await _addressResolver.GetOptionsAsync(connection, addressFamily, cancellationToken)
                              .ConfigureAwait(false);

            if (port > 0 && pasvOptions.HasPortRange && (port > pasvOptions.PasvMaxPort || port < pasvOptions.PasvMinPort))
            {
                throw new ArgumentOutOfRangeException(
                          nameof(port),
                          $"must be in {pasvOptions.PasvMinPort}:{pasvOptions.PasvMaxPort}");
            }

            if (port == 0 && pasvOptions.HasPortRange)
            {
                listener = CreateListenerInRange(connection, pasvOptions);
            }
            else
            {
                listener = new PasvListener(connection.LocalEndPoint.Address, port, pasvOptions.PublicAddress);
            }

            return(listener);
        }
        /// <inheritdoc />
        public Task <IPasvListener> CreateTcpListener(IFtpConnection connection, int port)
        {
            IPasvListener listener;

            if (port < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(port), "may not be less than 0");
            }

            if (port > 0 && _pasvMinPort > 0 && (port > _pasvMaxPort || port < _pasvMinPort))
            {
                throw new ArgumentOutOfRangeException(nameof(port), $"must be in {_pasvMinPort}:{_pasvMaxPort}");
            }

            if (port == 0 && _pasvPorts != null)
            {
                listener = CreateListenerInRange(connection);
            }
            else
            {
                listener = new PasvListener(connection.LocalEndPoint.Address, port, PasvExternalAddress);
            }

            return(Task.FromResult(listener));
        }