commit 816c93e021efba3b3db49bbfbff0c2ae224426a1
parent ea9dc4aeaa722ab2e95cfb57f35e319ee983927b
Author: Matthias Jaros <jaros@mailbox.org>
Date: Fri, 23 Jan 2026 22:39:39 +0100
Added support for delayInMillis in between connection attempts
Diffstat:
3 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/src/main/java/com/it_jaros/networkScanner/CliParser.java b/src/main/java/com/it_jaros/networkScanner/CliParser.java
@@ -7,12 +7,11 @@ public class CliParser {
throw new IllegalArgumentException("No argument given");
}
- String currentArg;
String target = null;
int socketLimit = 1000;
int delayInMillis = 0;
for (int i = 0; i < args.length; i++) {
- currentArg = args[i];
+ final String currentArg = args[i];
if (!currentArg.startsWith("-")) {
target = currentArg;
continue;
diff --git a/src/main/java/com/it_jaros/networkScanner/ScanTarget.java b/src/main/java/com/it_jaros/networkScanner/ScanTarget.java
@@ -1,3 +1,3 @@
package com.it_jaros.networkScanner;
-public record ScanTarget(String address, int openSocketLimit, int delay) {}
+public record ScanTarget(String address, int openSocketLimit, int delayInMillis) {}
diff --git a/src/main/java/com/it_jaros/networkScanner/Scanner.java b/src/main/java/com/it_jaros/networkScanner/Scanner.java
@@ -10,30 +10,35 @@ import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.locks.LockSupport;
public class Scanner {
private Counter counter = new Counter();
- private final int socketLimitDefault = 1024;
public Scanner() {}
public List<Integer> scanPorts(ScanTarget
target) {
- return scanPorts(target.address(), target.openSocketLimit());
- }
-
- public List<Integer> scanPorts(String address) {
- return scanPorts(address, socketLimitDefault);
+ return scanPorts(target.address(), target.openSocketLimit(), target.delayInMillis());
}
- public List<Integer> scanPorts(String address, int socketLimit) {
+ public List<Integer> scanPorts(String address, int socketLimit, int delayInMillis) {
Queue<Integer> openPorts = new ConcurrentLinkedQueue<>();
Semaphore socketCap = new Semaphore(socketLimit);
+ long delayInNanos = TimeUnit.MILLISECONDS.toNanos(Math.max(0, delayInMillis));
+ AtomicLong nextStartNanos = new AtomicLong(System.nanoTime());
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
for (int port = 1; port < 65536; port++) {
final int currentPort = port;
executor.submit(() -> {
+ if (delayInNanos > 0) {
+ long mySlot = nextStartNanos.getAndAdd(delayInNanos);
+ long wait = mySlot - System.nanoTime();
+ if (wait > 0) LockSupport.parkNanos(wait);
+ }
socketCap.acquireUninterruptibly();
counter.inc();
try (Socket socket = new Socket()) {