private List <AddressPortPair> MergePortScanInput(PortScanInput portScanInput) { var result = new List <AddressPortPair>(); foreach (var address in portScanInput.Addresses) { foreach (var port in portScanInput.Ports) { result.Add(new AddressPortPair { Address = address, Port = port }); } } return(result); }
public async Task <List <PortScanResult> > PortScan(PortScanInput portScanInput, IPortClient portClient) { var result = new BlockingCollection <PortScanResult>(); var mergedInput = MergePortScanInput(portScanInput); var addressPortPairs = mergedInput.ChunkInto(portScanInput.Workers); await AsyncHelper.ForEach(addressPortPairs, async (addressPortPair, token) => { foreach (var pair in addressPortPair) { if (token.IsCancellationRequested) { break; } var portResultEntry = await IsPortOpen(new PortInput { Address = pair.Address, Retries = portScanInput.Retries, Timeout = portScanInput.Timeout, Port = pair.Port }, portClient); var addressResult = result.FirstOrDefault(r => r.Address == pair.Address); if (addressResult == null) { var portResult = new PortScanResult { Address = pair.Address, }; portResult.Results.Add(portResultEntry); result.Add(portResult); } else { addressResult.Results.Add(portResultEntry); } OnPortScanned(pair.Address, portResultEntry); } }, portScanInput.CancellationToken); var finalResult = result.ToList(); OnPortsScanComplete(finalResult); return(finalResult); }
public Task <List <ProcessingQueueItem <PortInput, List <PortResult> > > > PortScan(PortScanInput portScanInput, IPortClient portClient, CancellationToken cancellationToken = default) { this.portClient = portClient; var input = portScanInput.Addresses.Select(s => new PortInput { Address = s, Ports = portScanInput.Ports, Retries = portScanInput.Retries, Timeout = portScanInput.Timeout }).ToList(); return(Run(input, cancellationToken)); }