diff options
Diffstat (limited to 'src/main/java/com/it_jaros/networkScanner/Scanner.java')
| -rw-r--r-- | src/main/java/com/it_jaros/networkScanner/Scanner.java | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/src/main/java/com/it_jaros/networkScanner/Scanner.java b/src/main/java/com/it_jaros/networkScanner/Scanner.java index 1bc8848..f5205d5 100644 --- a/src/main/java/com/it_jaros/networkScanner/Scanner.java +++ b/src/main/java/com/it_jaros/networkScanner/Scanner.java @@ -43,9 +43,7 @@ public class Scanner { try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();) { List<Future<ScanResult>> futures = new ArrayList<>(); for (String target : targets) { - futures.add(executor.submit(() -> { - return scanTarget(target, ports); - })); + futures.add(executor.submit(() -> scanTarget(target, ports))); } futures.forEach((f) -> { @@ -64,32 +62,46 @@ public class Scanner { private ScanResult scanTarget(String target, String ports) { PortRange portRange = new PortRange(ports); - AtomicLong scanSlotFactory = new AtomicLong(System.nanoTime()); + AtomicLong portSlotFactory = new AtomicLong(System.nanoTime()); Queue<Integer> openPorts = new ConcurrentLinkedQueue<>(); Progress progress = new Progress(target, portRange.getTotal(), new AtomicInteger(), new AtomicInteger()); progressBar.submit(progress); try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();) { + List<Future<Integer>> futures = new ArrayList<>(); while (portRange.hasNext()) { final int currentPort = portRange.next(); - executor.submit(() -> { - try { - waitForSlot(scanSlotFactory); - if (isTargetPortOpen(target, currentPort)) { - openPorts.add(currentPort); - progress.open().incrementAndGet(); - } - } finally { - progress.done().incrementAndGet(); - } - }); + futures.add(executor.submit(() -> scanPort(target, portSlotFactory, currentPort))); } + + futures.forEach(f -> { + try { + int port = f.get(); + if (port != -1) { + openPorts.add(port); + progress.open().incrementAndGet(); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } finally { + progress.done().incrementAndGet(); + } + }); } return new ScanResult(target, openPorts); } + private int scanPort(String target, AtomicLong scanSlotFactory, final int currentPort) { + waitForSlot(scanSlotFactory); + if (isTargetPortOpen(target, currentPort)) { + return currentPort; + } + + return -1; + } + private void waitForSlot(AtomicLong scanSlotFactory) { if (delayInNanos > 0) { long slot = scanSlotFactory.getAndAdd(delayInNanos); |
