diff options
| author | 2026-01-23 22:39:39 +0100 | |
|---|---|---|
| committer | 2026-07-09 09:59:28 +0200 | |
| commit | 93e836f8197e748ae8c0eb6ff8060d6064f8686a (patch) | |
| tree | db5e980d709fc2bf35197ee4dd16ee012b8d4589 /src/main/java/com/it_jaros | |
| parent | cbf08c1560c18bede155efc6b3a6a501a338661e (diff) | |
Added support for delayInMillis in between connection attempts
Diffstat (limited to 'src/main/java/com/it_jaros')
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 index 442e7c1..6f7c4b1 100644 --- 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 index cb29fff..1425249 100644 --- 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 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<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()) { |
