/// <summary> /// Create scanner /// </summary> /// <param name="logger"></param> /// <param name="source"></param> /// <param name="target"></param> /// <param name="portProbe"></param> /// <param name="maxProbeCount"></param> /// <param name="minProbePercent"></param> /// <param name="timeout"></param> /// <param name="ct"></param> public PortScanner(ILogger logger, IEnumerable <IPEndPoint> source, Action <IPEndPoint> target, IPortProbe portProbe, int?maxProbeCount, int?minProbePercent, TimeSpan?timeout, CancellationToken ct) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _source = source?.GetEnumerator() ?? throw new ArgumentNullException(nameof(source)); _target = target ?? throw new ArgumentNullException(nameof(target)); _maxProbeCount = maxProbeCount ?? kDefaultMaxProbeCount; _minProbeCount = (int)(_maxProbeCount * ((minProbePercent ?? kDefaultMinProbePercent) / 100.0)); _timeout = timeout ?? kDefaultProbeTimeout; _portProbe = portProbe ?? new NullPortProbe(); _requeued = new ConcurrentQueue <IPEndPoint>(); _rand = new Random(); _probePool = LinqEx .Repeat(i => new ConnectProbe(this, i), _maxProbeCount) .ToList(); _cts = new CancellationTokenSource(); ct.Register(_cts.Cancel); _completion = new TaskCompletionSource <bool>(); _active = _maxProbeCount; foreach (var probe in _probePool) { probe.Start(); } }
/// <summary> /// Create scanner /// </summary> /// <param name="source"></param> /// <param name="target"></param> /// <param name="portProbe"></param> /// <param name="maxProbeCount"></param> /// <param name="minProbePercent"></param> /// <param name="timeout"></param> /// <param name="ct"></param> public async Task ScanAsync(IEnumerable <IPEndPoint> source, Action <IPEndPoint> target, IPortProbe portProbe, int?maxProbeCount, int?minProbePercent, TimeSpan?timeout, CancellationToken ct) { using (var scanner = new PortScanner(_logger, source, (s, p) => target(p), portProbe, maxProbeCount, minProbePercent, timeout, ct)) { await scanner.Completion; } }
/// <summary> /// Create scanner /// </summary> /// <param name="services"></param> /// <param name="source"></param> /// <param name="target"></param> /// <param name="portProbe"></param> /// <param name="ct"></param> public static Task ScanAsync(this IScanServices services, IEnumerable <IPEndPoint> source, Action <IPEndPoint> target, IPortProbe portProbe, CancellationToken ct) => services.ScanAsync(source, target, portProbe, 5000, null, null, ct);
/// <summary> /// Scan range of addresses and return the ones that are open /// </summary> /// <param name="services"></param> /// <param name="range"></param> /// <param name="probe"></param> /// <param name="ct"></param> /// <returns></returns> public static async Task <IEnumerable <IPEndPoint> > ScanAsync(this IScanServices services, IEnumerable <IPEndPoint> range, IPortProbe probe, CancellationToken ct) { var result = new List <IPEndPoint>(); await ScanAsync(services, range, ep => result.Add(ep), probe, ct); return(result); }
/// <summary> /// Create scanner /// </summary> /// <param name="logger"></param> /// <param name="source"></param> /// <param name="target"></param> /// <param name="portProbe"></param> /// <param name="ct"></param> public PortScanner(ILogger logger, IEnumerable <IPEndPoint> source, Action <IPEndPoint> target, IPortProbe portProbe, CancellationToken ct) : this(logger, source, target, portProbe, null, null, null, ct) { }