From 00c024dff93fdfa107a20c5371e4e6ffdbf77ad1 Mon Sep 17 00:00:00 2001 From: Matthias Jaros Date: Sun, 22 Feb 2026 21:12:51 +0100 Subject: Refactoring für bessere Visibility und Verständnis MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/it_jaros/networkScanner/App.java | 6 +-- .../java/com/it_jaros/networkScanner/Scanner.java | 48 +++++++++++----------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/it_jaros/networkScanner/App.java b/src/main/java/com/it_jaros/networkScanner/App.java index 715fee4..ea267d3 100644 --- a/src/main/java/com/it_jaros/networkScanner/App.java +++ b/src/main/java/com/it_jaros/networkScanner/App.java @@ -8,9 +8,9 @@ public class App { CliParser cliParser = new CliParser(); try { ScanOptions options = cliParser.parseArgs(args); - Scanner scanner = new Scanner(options.openSocketLimit(), options.timeoutInMillis()); - List openPorts = scanner.scanPorts(options); - printResults(openPorts); + Scanner scanner = new Scanner(options.openSocketLimit(), options.timeoutInMillis(), + options.delayInMillis()); + printResults(scanner.scan(options)); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); cliParser.usageAndExit(); diff --git a/src/main/java/com/it_jaros/networkScanner/Scanner.java b/src/main/java/com/it_jaros/networkScanner/Scanner.java index ab24af0..53e1dcf 100644 --- a/src/main/java/com/it_jaros/networkScanner/Scanner.java +++ b/src/main/java/com/it_jaros/networkScanner/Scanner.java @@ -21,32 +21,30 @@ public class Scanner { private final Counter counter = new Counter(); private final ProgressBar progressBar = new ProgressBar(); - private final Semaphore socketCap; + private final Semaphore socketLimit; private final int timeoutInMillis; + private final long delayInNanos; - public Scanner(int socketLimit, int timeoutInMillis) { + public Scanner(int socketLimit, int timeoutInMillis, int delayInMillis) { this.timeoutInMillis = timeoutInMillis; - socketCap = new Semaphore(socketLimit); + this.delayInNanos = TimeUnit.MILLISECONDS.toNanos(Math.max(0, delayInMillis)); + this.socketLimit = new Semaphore(socketLimit); } - public Scanner() { - this(1000, 1000); + public List scan(ScanOptions target) { + return scanTargets(target.targets(), target.ports()); } - public List scanPorts(ScanOptions target) { - return scanPorts(target.targets(), target.delayInMillis(), target.ports()); - } - - public List scanPorts(List targets, int delayInMillis, String ports) { + public List scanTargets(List targets, String ports) { List results = new ArrayList<>(); - long delayInNanos = TimeUnit.MILLISECONDS.toNanos(Math.max(0, delayInMillis)); try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();) { List hosts = new ArrayList<>(); for (String target : targets) { - PortRange portsRange = new PortRange(ports); - Progress progress = new Progress(target, portsRange.getTotal(), new AtomicInteger(), new AtomicInteger()); + PortRange portRange = new PortRange(ports); + Progress progress = new Progress(target, portRange.getTotal(), new AtomicInteger(), + new AtomicInteger()); hosts.add(progress); - results.add(scanTarget(target, portsRange, delayInNanos, executor, progress)); + results.add(scanTargetPorts(target, portRange, executor, progress)); } progressBar.start(hosts); } @@ -56,7 +54,7 @@ public class Scanner { return results; } - private ScanResult scanTarget(String target, PortRange portRange, long delayInNanos, ExecutorService executor, + private ScanResult scanTargetPorts(String target, PortRange portRange, ExecutorService executor, Progress p) { AtomicLong scanSlotFactory = new AtomicLong(System.nanoTime()); Queue openPorts = new ConcurrentLinkedQueue<>(); @@ -64,12 +62,7 @@ public class Scanner { final int currentPort = portRange.next(); executor.submit(() -> { try { - if (delayInNanos > 0) { - long mySlot = scanSlotFactory.getAndAdd(delayInNanos); - long wait = mySlot - System.nanoTime(); - if (wait > 0) - LockSupport.parkNanos(wait); - } + waitForSlot(scanSlotFactory); if (isTargetPortOpen(target, currentPort)) { openPorts.add(currentPort); progressBar.onPortOpen(p); @@ -82,8 +75,17 @@ public class Scanner { return new ScanResult(target, openPorts); } + private void waitForSlot(AtomicLong scanSlotFactory) { + if (delayInNanos > 0) { + long slot = scanSlotFactory.getAndAdd(delayInNanos); + long wait = slot - System.nanoTime(); + if (wait > 0) + LockSupport.parkNanos(wait); + } + } + private boolean isTargetPortOpen(String target, int port) { - socketCap.acquireUninterruptibly(); + socketLimit.acquireUninterruptibly(); counter.inc(); try (Socket socket = new Socket()) { socket.connect(new InetSocketAddress(target, port), timeoutInMillis); @@ -93,7 +95,7 @@ public class Scanner { System.out.println(e.getClass().getSimpleName() + ": " + e.getMessage()); } finally { counter.dec(); - socketCap.release(); + socketLimit.release(); } return false; -- cgit v1.3.1