From 01484b058c24607b1a8f45f65f058e121c2fcd23 Mon Sep 17 00:00:00 2001 From: Matthias Jaros Date: Mon, 16 Mar 2026 12:05:35 +0100 Subject: - Removed synchronized on PortRange class, because only called from one thread only. - Added max virtual thread worker cap to reduce memory consumption if required. Therefore also moved progress update into virtual thread, otherwise progress just gets updated at the end of a target host scan. --- .../java/com/it_jaros/networkScanner/PortRange.java | 4 ++-- .../java/com/it_jaros/networkScanner/Scanner.java | 19 ++++++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/main/java/com/it_jaros/networkScanner/PortRange.java b/src/main/java/com/it_jaros/networkScanner/PortRange.java index 2c93f28..9075ec2 100644 --- a/src/main/java/com/it_jaros/networkScanner/PortRange.java +++ b/src/main/java/com/it_jaros/networkScanner/PortRange.java @@ -65,7 +65,7 @@ public class PortRange { } } - public synchronized int next() { + public int next() { int p = availablePorts.nextSetBit(cursor); if (p > 0) { availablePorts.clear(p); @@ -77,7 +77,7 @@ public class PortRange { throw new NoSuchElementException("Reached end of port range"); } - public synchronized boolean hasNext() { + public boolean hasNext() { return availablePorts.nextSetBit(cursor) > 0; } diff --git a/src/main/java/com/it_jaros/networkScanner/Scanner.java b/src/main/java/com/it_jaros/networkScanner/Scanner.java index 518372f..50c1139 100644 --- a/src/main/java/com/it_jaros/networkScanner/Scanner.java +++ b/src/main/java/com/it_jaros/networkScanner/Scanner.java @@ -22,6 +22,7 @@ public class Scanner { private final Counter counter = new Counter(); private final ProgressBar progressBar = new ProgressBar(); + private final Semaphore maxWorkers = new Semaphore(100000); private final Semaphore socketLimit; private final int timeoutInMillis; private final long delayInNanos; @@ -70,10 +71,20 @@ public class Scanner { try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();) { List> futures = new ArrayList<>(); while (portRange.hasNext()) { + maxWorkers.acquireUninterruptibly(); final int currentPort = portRange.next(); futures.add(executor.submit(() -> { - waitForSlot(portSlotFactory); - return scanPort(target, currentPort); + try { + waitForSlot(portSlotFactory); + int port = scanPort(target, currentPort); + if (port != -1) { + progress.open().incrementAndGet(); + } + return port; + } finally { + maxWorkers.release(); + progress.done().incrementAndGet(); + } })); } @@ -81,13 +92,11 @@ public class Scanner { try { int port = f.get(); if (port != -1) { + // openPorts is not threadsafe, so we do not update it outside the worker threads openPorts.set(port); - progress.open().incrementAndGet(); } } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); - } finally { - progress.done().incrementAndGet(); } }); } -- cgit v1.3.1