summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-03-16 16:21:32 +0100
committerGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-07-09 09:59:28 +0200
commit1f87648ba3c1aabdd167b955d5f10e2c7613c691 (patch)
treea64280bf8ac1a9bc96d0538d7423aad72ea3feb8
parent3ea51b908ef949267264a027e2462b220900aa45 (diff)
Added cli option for worker threads per host
-rw-r--r--src/main/java/com/it_jaros/networkScanner/App.java2
-rw-r--r--src/main/java/com/it_jaros/networkScanner/CliParser.java18
-rw-r--r--src/main/java/com/it_jaros/networkScanner/ScanOptions.java2
-rw-r--r--src/main/java/com/it_jaros/networkScanner/Scanner.java6
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
index bedc8c1..8e15730 100644
--- 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
index 3550249..9bb146b 100644
--- 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
index 32bfb2c..aee95a3 100644
--- 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
index d219307..a013296 100644
--- 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());