diff options
| author | 2026-03-16 23:34:05 +0100 | |
|---|---|---|
| committer | 2026-07-09 09:59:28 +0200 | |
| commit | 848fd74e79774e5c5c12928f8673376973281f04 (patch) | |
| tree | 142f7f65932067876167544d1db8978eb7eca0f6 /src/main/java/com/it_jaros/network_scanner/Scanner.java | |
| parent | ae7fdb17ea6233624b3c38128263ace6e9ad119f (diff) | |
Added maxTargetLimit for a cap that defines how many targets are scanned
at the same time.
Diffstat (limited to 'src/main/java/com/it_jaros/network_scanner/Scanner.java')
| -rw-r--r-- | src/main/java/com/it_jaros/network_scanner/Scanner.java | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/main/java/com/it_jaros/network_scanner/Scanner.java b/src/main/java/com/it_jaros/network_scanner/Scanner.java index 81cbe1b..7ee0276 100644 --- a/src/main/java/com/it_jaros/network_scanner/Scanner.java +++ b/src/main/java/com/it_jaros/network_scanner/Scanner.java @@ -26,12 +26,14 @@ public class Scanner { private final int timeoutInMillis; private final long delayInNanos; private final int maxWorkersPerHost; + private final int maxTargetsLimit; - public Scanner(int socketLimit, int timeoutInMillis, int delayInMillis, int maxWorkersPerHost) { + public Scanner(int socketLimit, int timeoutInMillis, int delayInMillis, int maxWorkersPerHost, int maxTargetsLimit) { this.timeoutInMillis = timeoutInMillis; this.delayInNanos = TimeUnit.MILLISECONDS.toNanos(Math.max(0, delayInMillis)); this.socketLimit = new Semaphore(socketLimit); this.maxWorkersPerHost = maxWorkersPerHost; + this.maxTargetsLimit = maxTargetsLimit; } public List<ScanResult> scan(ScanOptions target) { @@ -43,8 +45,16 @@ public class Scanner { progressBar.start(); try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) { List<Future<ScanResult>> futures = new ArrayList<>(); + Semaphore maxTargets = new Semaphore(maxTargetsLimit); for (String target : targets) { - futures.add(executor.submit(() -> scanTarget(target, ports))); + maxTargets.acquireUninterruptibly(); + futures.add(executor.submit(() -> { + try { + return scanTarget(target, ports); + } finally { + maxTargets.release(); + } + })); } futures.forEach((Future<ScanResult> f) -> { |
