diff options
| author | 2026-07-02 12:45:18 +0200 | |
|---|---|---|
| committer | 2026-07-09 09:59:28 +0200 | |
| commit | e7c1ff527b171f76260efd0f69f8d3f4f7360123 (patch) | |
| tree | f2baa25eca484918b3311e120b40394355112f50 | |
| parent | 53ad9b193e3c5fd2324edeca838e5a8e4cce7ed1 (diff) | |
Changed scanstate to class that now owns completetly the Result List and
does not allow modifications outside of defined methods. -> thread safe
| -rw-r--r-- | src/main/java/com/it_jaros/jscanner/ScanState.java | 34 | ||||
| -rw-r--r-- | src/main/java/com/it_jaros/jscanner/Scanner.java | 18 |
2 files changed, 42 insertions, 10 deletions
diff --git a/src/main/java/com/it_jaros/jscanner/ScanState.java b/src/main/java/com/it_jaros/jscanner/ScanState.java index e3a4300..86c3615 100644 --- a/src/main/java/com/it_jaros/jscanner/ScanState.java +++ b/src/main/java/com/it_jaros/jscanner/ScanState.java @@ -1,5 +1,37 @@ package com.it_jaros.jscanner; +import java.util.ArrayList; import java.util.List; -public record ScanState(Counter counter, ProgressBar progressBar, List<ScanResult> scanResult) {} +public class ScanState { + private final Counter counter; + private final ProgressBar progressBar; + private final List<ScanResult> scanResult; + + public ScanState(Counter counter, ProgressBar progressBar) { + this.counter = counter; + this.progressBar = progressBar; + // scanResult can not be given from outside because this class controls full access to it + this.scanResult = new ArrayList<>(); + } + + public Counter getCounter() { + return counter; + } + + public ProgressBar getProgressBar() { + return progressBar; + } + + public void addScanResult(ScanResult newResult) { + synchronized (this.scanResult) { + this.scanResult.add(newResult); + } + } + + public List<ScanResult> getSnapshotOfScanResults() { + synchronized (scanResult) { + return List.copyOf(scanResult); + } + } +} diff --git a/src/main/java/com/it_jaros/jscanner/Scanner.java b/src/main/java/com/it_jaros/jscanner/Scanner.java index 4ac60b1..5fd2d4b 100644 --- a/src/main/java/com/it_jaros/jscanner/Scanner.java +++ b/src/main/java/com/it_jaros/jscanner/Scanner.java @@ -86,8 +86,8 @@ public class Scanner implements AutoCloseable { } public List<ScanResult> scanHosts(Stream<String> hosts, String ports) throws IOException { - ScanState scanState = new ScanState(new Counter(), new ProgressBar(quiet), new ArrayList<>()); - scanState.progressBar().start(); + ScanState scanState = new ScanState(new Counter(), new ProgressBar(quiet)); + scanState.getProgressBar().start(); try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) { CompletionService<ScanResult> completionService = new ExecutorCompletionService<>(executor); Queue<String> hostsInQueue = hosts.collect(Collectors.toCollection(ArrayDeque::new)); @@ -109,7 +109,7 @@ public class Scanner implements AutoCloseable { } activeHostWorkers--; hostsToProcess--; - scanState.scanResult().add(finishedHost.get()); + scanState.addScanResult(finishedHost.get()); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } catch (ExecutionException e) { @@ -122,13 +122,13 @@ public class Scanner implements AutoCloseable { } } - scanState.progressBar().stop(); + scanState.getProgressBar().stop(); System.out.println("--------------------"); System.out.println("Finished scan!"); System.out.println("Stats:"); - System.out.println("Peak concurrent connects: " + scanState.counter().max()); + System.out.println("Peak concurrent connects: " + scanState.getCounter().max()); System.out.println("--------------------"); - return scanState.scanResult(); + return scanState.getSnapshotOfScanResults(); } private ScanResult scanHost(String host, String ports, ScanState scanState) { @@ -140,7 +140,7 @@ public class Scanner implements AutoCloseable { // Give progressbar the current progress object which is then updated in the sub virtual threads Progress progress = new Progress(host, portRange.getTotal(), new AtomicInteger(), new AtomicInteger(), new AtomicInteger()); - scanState.progressBar().submit(progress); + scanState.getProgressBar().submit(progress); if (!disableOnlineCheck && !checkHostOnline(host)) { // Visually show that this host is basically done @@ -228,7 +228,7 @@ public class Scanner implements AutoCloseable { // don't allow more sockets then specified socketLimit.acquireUninterruptibly(); // count how many ports are concurrently checked - scanState.counter().inc(); + scanState.getCounter().inc(); try (Socket socket = new Socket()) { socket.connect(new InetSocketAddress(host, port), timeoutInMillis); @@ -244,7 +244,7 @@ public class Scanner implements AutoCloseable { // NoRouteToHostException: this can be safely ignored because the port is closed if a host is unreachable // Will happen a lot when scanning for open ports, so not needed } finally { - scanState.counter().dec(); + scanState.getCounter().dec(); socketLimit.release(); } |
