commit 8a3b6c8d32b2dc5092e219ef16151ddafeafac63 parent e66637a019cd2581fea9d5971c25ae7cf7ec6d56 Author: Matthias Jaros <jaros@mailbox.org> Date: Mon, 16 Mar 2026 16:21:32 +0100 Added cli option for worker threads per host Diffstat:
4 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/src/main/java/com/it_jaros/networkScanner/App.java b/src/main/java/com/it_jaros/networkScanner/App.java @@ -9,7 +9,7 @@ public class App { try { ScanOptions options = cliParser.parseArgs(args); Scanner scanner = new Scanner(options.openSocketLimit(), options.timeoutInMillis(), - options.delayInMillis()); + options.delayInMillis(), options.maxWorkersPerHost()); printResults(scanner.scan(options)); } catch (IllegalArgumentException e) { System.out.printf("Error while parsing arguments: %s", e.getMessage()); diff --git a/src/main/java/com/it_jaros/networkScanner/CliParser.java b/src/main/java/com/it_jaros/networkScanner/CliParser.java @@ -14,6 +14,7 @@ public class CliParser { int socketLimit = 1000; int delayInMillis = 0; int timeoutInMillis = 1000; + int maxWorkersPerHost = 1000; String ports = "1-1024"; for (int i = 0; i < args.length; i++) { final String currentArg = args[i]; @@ -26,6 +27,7 @@ public class CliParser { switch (currentArg) { case "--help", "-h": usageAndExit(); + break; case "--socketLimit", "-sl": socketLimit = Integer.parseInt(args[++i]); break; @@ -38,6 +40,9 @@ public class CliParser { case "--ports", "-p": ports = args[++i]; break; + case "--maxWorkersPerHost", "-wh": + maxWorkersPerHost = Integer.parseInt(args[++i]); + break; default: throw new IllegalArgumentException("No such param " + currentArg); } @@ -48,10 +53,10 @@ public class CliParser { } System.out.printf( - "Parsed arguments: targets('%s'), ports(%s), socketLimit(%s), delayInMillis(%s), timeoutInMillis(%s)\n", - targets, ports, socketLimit, delayInMillis, timeoutInMillis); + "Parsed arguments: targets('%s'), ports(%s), socketLimit(%s), delayInMillis(%s), timeoutInMillis(%s), maxWorkersPerHost(%s)%n", + targets, ports, socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost); - return new ScanOptions(targets.stream().toList(), socketLimit, delayInMillis, timeoutInMillis, ports); + return new ScanOptions(targets.stream().toList(), socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, ports); } public void usageAndExit() { @@ -60,10 +65,11 @@ public class CliParser { java -jar scanner.jar [OPTIONS] <host> Options: - --delay, -d: Waiting period in millis for connection attempts for a host - --socketLimit, -sl: Socket Connection limit for a host - --timeout, -t: Timeout per connection attempt + --delay, -d: Waiting period in millis for connection attempts for a host; (Default: 0) + --socketLimit, -sl: Socket Connection limit for a host; (Default: 1000) + --timeout, -t: Timeout per connection attempt, 0 means infinite: (Default: 1000) --ports, -p: Ports to be scanned + --maxWorkersPerHost, -wh: Virtual Worker Threads run per target. Higher doesn't mean necessarily faster. But the more you use the more RAM is required. (Default: 1000) Examples: java -jar scanner.jar localhost diff --git a/src/main/java/com/it_jaros/networkScanner/ScanOptions.java b/src/main/java/com/it_jaros/networkScanner/ScanOptions.java @@ -2,4 +2,4 @@ package com.it_jaros.networkScanner; import java.util.List; -public record ScanOptions(List<String> targets, int openSocketLimit, int delayInMillis, int timeoutInMillis, String ports) {} +public record ScanOptions(List<String> targets, int openSocketLimit, int delayInMillis, int timeoutInMillis, int maxWorkersPerHost, String ports) {} diff --git a/src/main/java/com/it_jaros/networkScanner/Scanner.java b/src/main/java/com/it_jaros/networkScanner/Scanner.java @@ -25,11 +25,13 @@ public class Scanner { private final Semaphore socketLimit; private final int timeoutInMillis; private final long delayInNanos; + private final int maxWorkersPerHost; - public Scanner(int socketLimit, int timeoutInMillis, int delayInMillis) { + public Scanner(int socketLimit, int timeoutInMillis, int delayInMillis, int maxWorkersPerHost) { this.timeoutInMillis = timeoutInMillis; this.delayInNanos = TimeUnit.MILLISECONDS.toNanos(Math.max(0, delayInMillis)); this.socketLimit = new Semaphore(socketLimit); + this.maxWorkersPerHost = maxWorkersPerHost; } public List<ScanResult> scan(ScanOptions target) { @@ -64,7 +66,7 @@ public class Scanner { private ScanResult scanTarget(String target, String ports) { PortRange portRange = new PortRange(ports); AtomicLong portSlotFactory = new AtomicLong(System.nanoTime()); - Semaphore maxWorkers = new Semaphore(1000); + Semaphore maxWorkers = new Semaphore(maxWorkersPerHost); BitSet openPorts = new BitSet(PortRange.MAX_PORT); Progress progress = new Progress(target, portRange.getTotal(), new AtomicInteger(), new AtomicInteger());