jscanner

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
Msrc/main/java/com/it_jaros/networkScanner/CliParser.java | 3+--
Msrc/main/java/com/it_jaros/networkScanner/ScanTarget.java | 2+-
Msrc/main/java/com/it_jaros/networkScanner/Scanner.java | 19++++++++++++-------
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()) {