commit dc2e873b73de4fce58cd120ac7479ea340940b54
parent 8a42dfd1c69895cdd9946e71079218b307577ca3
Author: Matthias Jaros <jaros@mailbox.org>
Date: Sun, 22 Feb 2026 20:30:46 +0100
Refactored port scan method and fixed open ports indicator
Diffstat:
2 files changed, 30 insertions(+), 20 deletions(-)
diff --git a/src/main/java/com/it_jaros/networkScanner/ProgressBar.java b/src/main/java/com/it_jaros/networkScanner/ProgressBar.java
@@ -32,20 +32,21 @@ public class ProgressBar {
private void drawBar(Progress progress) {
System.out.print("\u001b[2K\r");
System.out.println(createBar(
- progress.host() + " open=" + progress.open().get(),
+ progress.host(),
+ progress.open().get(),
progress.done().get(),
progress.total()));
}
- public String createBar(String label, int done, int total) {
+ public String createBar(String label, int open, int done, int total) {
int width = 30;
double pct = total == 0 ? 1.0 : (done / (double) total);
int filled = (int) (pct * width);
- String b = "[" + "#".repeat(filled) + "-".repeat(width - filled) + "]";
+ String brackets = "[" + "#".repeat(filled) + "-".repeat(width - filled) + "]";
int percent = (int) (pct * 100);
- return String.format("%-25s %s %3d%% (%d/%d)", label, b, percent, done, total);
+ return String.format("%-40s open=%s %s %3d%% (%d/%d)", label, open, brackets, percent, done, total);
}
public void stop() {
@@ -58,7 +59,11 @@ public class ProgressBar {
}
}
- void onPortFinished(Progress p) {
- p.done().incrementAndGet();
+ void onPortFinished(Progress progress) {
+ progress.done().incrementAndGet();
+ }
+
+ public void onPortOpen(Progress progress) {
+ progress.open().incrementAndGet();
}
}
diff --git 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;
}
}