diff options
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/com/it_jaros/networkScanner/PortRange.java | 4 | ||||
| -rw-r--r-- | src/main/java/com/it_jaros/networkScanner/Scanner.java | 19 |
2 files changed, 16 insertions, 7 deletions
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<Future<Integer>> 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(); } }); } |
