commit 25bd1759bb87ef7456ad7e4a997ac8425eda27bb
parent ebf068a3d6ff0f21ab990737fd2d9f470c9a192a
Author: Matthias Jaros <jaros@mailbox.org>
Date: Mon, 6 Jul 2026 11:05:31 +0200
Changing scanner from collecting all results to a stream of output.
Saves RAM and is not necessary to first collect everything
Diffstat:
3 files changed, 9 insertions(+), 20 deletions(-)
diff --git a/src/main/java/com/it_jaros/jscanner/App.java b/src/main/java/com/it_jaros/jscanner/App.java
@@ -24,7 +24,7 @@ public class App {
try (Scanner scanner = new Scanner(options)) {
Scan scan = Scan.create(options);
addShutdownHook(scanner);
- printScanResults(scanner.runScan(scan), scan.getPeakConcurrentConnects(), options.showFilteredPorts());
+ scanner.runScan(scan, result -> printPortsResults(result, options.showFilteredPorts()));
} finally {
shutdownLatch.countDown();
removeShutdownHook();
diff --git a/src/main/java/com/it_jaros/jscanner/Scan.java b/src/main/java/com/it_jaros/jscanner/Scan.java
@@ -13,23 +13,17 @@ import java.util.stream.Stream;
*/
public class Scan {
private final Stream<String> hosts;
- private final ScanState state;
private final String ports;
private final Counter counter;
private final ProgressBar progressBar;
- private Scan(Stream<String> hosts, String ports, ScanState state, boolean quiet) {
+ private Scan(Stream<String> hosts, String ports, boolean quiet) {
this.hosts = hosts;
this.ports = ports;
- this.state = state;
this.counter = new Counter();
this.progressBar = new ProgressBar(quiet);
}
- public List<ScanResult> getResults() {
- return this.state.getCopyOfResults();
- }
-
public int getPeakConcurrentConnects() {
return counter.max();
}
@@ -70,11 +64,11 @@ public class Scan {
}
private static Scan create(Stream<String> lines, String ports, boolean quiet) {
- return new Scan(lines, ports, new ScanState(), quiet);
+ return new Scan(lines, ports, quiet);
}
public static Scan create(List<String> hostsArgv, String ports, boolean quiet) {
- return new Scan(hostsArgv.stream(), ports, new ScanState(), quiet);
+ return new Scan(hostsArgv.stream(), ports, quiet);
}
public Stream<String> getHosts() {
@@ -105,8 +99,4 @@ public class Scan {
public void decSocketCounter() {
counter.dec();
}
-
- public void addScanResult(ScanResult scanResult) {
- state.addScanResult(scanResult);
- }
}
diff --git a/src/main/java/com/it_jaros/jscanner/Scanner.java b/src/main/java/com/it_jaros/jscanner/Scanner.java
@@ -10,6 +10,7 @@ import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Consumer;
import java.util.function.Function;
public class Scanner implements AutoCloseable {
@@ -54,9 +55,8 @@ public class Scanner implements AutoCloseable {
* Starts a given scan.
*
* @param scan
- * @return
*/
- public List<ScanResult> runScan(final Scan scan) {
+ public void runScan(final Scan scan, final Consumer<ScanResult> consumer) {
if (scan == null) {
throw new IllegalArgumentException("Scan argument cannot be null");
}
@@ -88,9 +88,8 @@ public class Scanner implements AutoCloseable {
// No matter what happens we have to free the resources after getting ScanResult
try {
ScanResult result = finishedHost.get();
- // we only want results that give value and not cost RAM for nothing
- if (!result.openPorts().isEmpty() || !result.filteredPorts().isEmpty()) {
- scan.addScanResult(result);
+ if (result != null) {
+ consumer.accept(result);
}
} finally {
state.activeWorkers().release();
@@ -104,7 +103,6 @@ public class Scanner implements AutoCloseable {
}
scan.stop();
- return scan.getResults();
}
/**
@@ -155,6 +153,7 @@ public class Scanner implements AutoCloseable {
try {
PortResult portResult = portResultFuture.get();
+ if (portResult == null) continue;
switch (portResult.getState()) {
case OPEN -> {
// bitset is not thread-safe, so it is set