summaryrefslogtreecommitdiff
path: root/src/main/java/com/it_jaros/networkScanner/Scanner.java
diff options
context:
space:
mode:
authorGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-02-22 20:30:46 +0100
committerGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-07-09 09:59:28 +0200
commitb5f567a7083acf0be5d2aa7c32f3c21781336bf2 (patch)
tree06f878c49465d8ee11f8420bb6039cb09758e591 /src/main/java/com/it_jaros/networkScanner/Scanner.java
parent6576e5a2cc583bb9f3637ea7aa91ba2305480d83 (diff)
Refactored port scan method and fixed open ports indicator
Diffstat (limited to 'src/main/java/com/it_jaros/networkScanner/Scanner.java')
-rw-r--r--src/main/java/com/it_jaros/networkScanner/Scanner.java33
1 files changed, 19 insertions, 14 deletions
diff --git a/src/main/java/com/it_jaros/networkScanner/Scanner.java b/src/main/java/com/it_jaros/networkScanner/Scanner.java
index 8dff0ed..8c8fdff 100644
--- a/src/main/java/com/it_jaros/networkScanner/Scanner.java
+++ b/src/main/java/com/it_jaros/networkScanner/Scanner.java
@@ -46,7 +46,7 @@ public class Scanner {
PortRange portsRange = new PortRange(ports);
Progress progress = new Progress(target, portsRange.getTotal(), new AtomicInteger(), new AtomicInteger());
hosts.add(progress);
- results.add(scanTargetAsync(target, portsRange, delayInNanos, executor, progress));
+ results.add(scanTarget(target, portsRange, delayInNanos, executor, progress));
}
progressBar.start(hosts);
}
@@ -56,14 +56,24 @@ public class Scanner {
return results;
}
- private ScanResult scanTargetAsync(String target, PortRange portRange, long delayInNanos, ExecutorService executor, Progress p) {
- AtomicLong nextStartNanos = new AtomicLong(System.nanoTime());
+ private ScanResult scanTarget(String target, PortRange portRange, long delayInNanos, ExecutorService executor,
+ Progress p) {
+ AtomicLong scanSlotFactory = new AtomicLong(System.nanoTime());
Queue<Integer> openPorts = new ConcurrentLinkedQueue<>();
while (portRange.hasNext()) {
final int currentPort = portRange.next();
executor.submit(() -> {
try {
- scanPortsAsync(target, delayInNanos, nextStartNanos, openPorts, currentPort);
+ if (delayInNanos > 0) {
+ long mySlot = scanSlotFactory.getAndAdd(delayInNanos);
+ long wait = mySlot - System.nanoTime();
+ if (wait > 0)
+ LockSupport.parkNanos(wait);
+ }
+ if (isTargetPortOpen(target, currentPort)) {
+ openPorts.add(currentPort);
+ progressBar.onPortOpen(p);
+ }
} finally {
progressBar.onPortFinished(p);
}
@@ -72,19 +82,12 @@ public class Scanner {
return new ScanResult(target, openPorts);
}
- private void scanPortsAsync(String target, long delayInNanos, AtomicLong nextStartNanos, Queue<Integer> openPorts,
- int currentPort) {
- if (delayInNanos > 0) {
- long mySlot = nextStartNanos.getAndAdd(delayInNanos);
- long wait = mySlot - System.nanoTime();
- if (wait > 0)
- LockSupport.parkNanos(wait);
- }
+ private boolean isTargetPortOpen(String target, int port) {
socketCap.acquireUninterruptibly();
counter.inc();
try (Socket socket = new Socket()) {
- socket.connect(new InetSocketAddress(target, currentPort), timeoutInMillis);
- openPorts.add(currentPort);
+ socket.connect(new InetSocketAddress(target, port), timeoutInMillis);
+ return true;
} catch (ConnectException | SocketTimeoutException ignored) {
} catch (IOException e) {
System.out.println(e.getClass().getSimpleName() + ": " + e.getMessage());
@@ -92,5 +95,7 @@ public class Scanner {
counter.dec();
socketCap.release();
}
+
+ return false;
}
}