Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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));
        }