From 93e836f8197e748ae8c0eb6ff8060d6064f8686a Mon Sep 17 00:00:00 2001 From: Matthias Jaros Date: Fri, 23 Jan 2026 22:39:39 +0100 Subject: Added support for delayInMillis in between connection attempts --- .../java/com/it_jaros/networkScanner/Scanner.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'src/main/java/com/it_jaros/networkScanner/Scanner.java') diff --git a/src/main/java/com/it_jaros/networkScanner/Scanner.java b/src/main/java/com/it_jaros/networkScanner/Scanner.java index 4f1c809..51d5373 100644 --- 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 scanPorts(ScanTarget target) { - return scanPorts(target.address(), target.openSocketLimit()); - } - - public List scanPorts(String address) { - return scanPorts(address, socketLimitDefault); + return scanPorts(target.address(), target.openSocketLimit(), target.delayInMillis()); } - public List scanPorts(String address, int socketLimit) { + public List scanPorts(String address, int socketLimit, int delayInMillis) { Queue 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()) { -- cgit v1.3.1