summaryrefslogtreecommitdiff
path: root/src/main/java/com/it_jaros/networkScanner/Scanner.java
diff options
context:
space:
mode:
authorGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-01-23 22:39:39 +0100
committerGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-07-09 09:59:28 +0200
commit93e836f8197e748ae8c0eb6ff8060d6064f8686a (patch)
treedb5e980d709fc2bf35197ee4dd16ee012b8d4589 /src/main/java/com/it_jaros/networkScanner/Scanner.java
parentcbf08c1560c18bede155efc6b3a6a501a338661e (diff)
Added support for delayInMillis in between connection attempts
Diffstat (limited to 'src/main/java/com/it_jaros/networkScanner/Scanner.java')
-rw-r--r--src/main/java/com/it_jaros/networkScanner/Scanner.java19
1 files changed, 12 insertions, 7 deletions
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()) {