summaryrefslogtreecommitdiff
path: root/src/main/java/com/it_jaros/network_scanner/Scanner.java
diff options
context:
space:
mode:
authorGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-03-16 23:34:05 +0100
committerGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-07-09 09:59:28 +0200
commit848fd74e79774e5c5c12928f8673376973281f04 (patch)
tree142f7f65932067876167544d1db8978eb7eca0f6 /src/main/java/com/it_jaros/network_scanner/Scanner.java
parentae7fdb17ea6233624b3c38128263ace6e9ad119f (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.java14
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) -> {