jscanner

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
Msrc/main/java/com/it_jaros/networkScanner/ProgressBar.java | 17+++++++++++------
Msrc/main/java/com/it_jaros/networkScanner/Scanner.java | 33+++++++++++++++++++--------------
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; } }