jscanner

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

commit dd745f128ad50c303977880d11870fb5539a94f8
parent a8dd54bc52340035a2097e19cf5d0e1f1ca1b722
Author: Matthias Jaros <jaros@mailbox.org>
Date:   Mon, 23 Mar 2026 14:29:55 +0100

Renamed blocked to filtered ports to do it like nmap and changed default
scan values

Diffstat:
Msrc/main/java/com/it_jaros/network_scanner/App.java | 16++++++++--------
Msrc/main/java/com/it_jaros/network_scanner/CliParser.java | 15++++++++-------
Msrc/main/java/com/it_jaros/network_scanner/PortState.java | 2+-
Msrc/main/java/com/it_jaros/network_scanner/Progress.java | 4++--
Msrc/main/java/com/it_jaros/network_scanner/ProgressBar.java | 6+++---
Msrc/main/java/com/it_jaros/network_scanner/ScanOptions.java | 2+-
Msrc/main/java/com/it_jaros/network_scanner/ScanResult.java | 2+-
Msrc/main/java/com/it_jaros/network_scanner/Scanner.java | 16+++++++++-------
8 files changed, 33 insertions(+), 30 deletions(-)

diff --git a/src/main/java/com/it_jaros/network_scanner/App.java b/src/main/java/com/it_jaros/network_scanner/App.java @@ -11,7 +11,7 @@ public class App { ScanOptions options = cliParser.parseArgs(args); Scanner scanner = new Scanner(options.openSocketLimit(), options.timeoutInMillis(), options.delayInMillis(), options.maxWorkersPerHost(), options.maxTargetsLimit()); - printResults(scanner.scan(options), options.showBlockedPorts()); + printResults(scanner.scan(options), options.showFilteredPorts()); } catch (IllegalArgumentException e) { System.out.printf("Error while parsing arguments: %s", e.getMessage()); cliParser.usageAndExit(); @@ -20,21 +20,21 @@ public class App { } } - public static void printResults(List<ScanResult> results, boolean showBlockedPorts) { - results.forEach((ScanResult r) -> printResult(r, showBlockedPorts)); + public static void printResults(List<ScanResult> results, boolean showFilteredPorts) { + results.forEach((ScanResult r) -> printResult(r, showFilteredPorts)); } - private static void printResult(ScanResult result, boolean showBlockedPorts) { - if (result.openPorts().isEmpty() && (!showBlockedPorts || result.blockedPorts().isEmpty())) { + private static void printResult(ScanResult result, boolean showFilteredPorts) { + if (result.openPorts().isEmpty() && (!showFilteredPorts || result.filteredPorts().isEmpty())) { return; } System.out.println(result.target()); if (!result.openPorts().isEmpty()) { - System.out.println("\topen:\t" + map(result.openPorts())); + System.out.printf("\t (%d) open:\t%s%n", result.openPorts().cardinality(), map(result.openPorts())); } - if (showBlockedPorts && !result.blockedPorts().isEmpty()) { - System.out.println("\tblocked:\t" + map(result.blockedPorts())); + if (showFilteredPorts && !result.filteredPorts().isEmpty()) { + System.out.printf("\t (%d) filtered:\t%s%n", result.filteredPorts().cardinality(), map(result.filteredPorts())); } System.out.println(); } diff --git a/src/main/java/com/it_jaros/network_scanner/CliParser.java b/src/main/java/com/it_jaros/network_scanner/CliParser.java @@ -13,11 +13,11 @@ public class CliParser { Set<String> targets = new HashSet<>(); int socketLimit = 1000; int delayInMillis = 0; - int timeoutInMillis = 1000; + int timeoutInMillis = 100; int maxWorkersPerHost = 1000; int maxTargetsLimit = 10; String ports = "1-1024"; - boolean showBlockedPorts = false; + boolean showFilteredPorts = false; for (int i = 0; i < args.length; i++) { final String currentArg = args[i]; if (!currentArg.startsWith("-")) { @@ -48,8 +48,8 @@ public class CliParser { case "--ports", "-p": ports = args[++i]; break; - case "--showBlocked", "-sb": - showBlockedPorts = true; + case "--showFilteredPorts", "-sf": + showFilteredPorts = true; break; default: throw new IllegalArgumentException("No such param " + currentArg); @@ -61,10 +61,10 @@ public class CliParser { } System.out.printf( - "Parsed arguments: targets('%s'), ports(%s), socketLimit(%s), delayInMillis(%s), timeoutInMillis(%s), maxWorkersPerHost(%s), maxTargetsLimit(%s), showBlockedPorts(%s) %n", - targets, ports, socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, maxTargetsLimit, showBlockedPorts); + "Parsed arguments: targets('%s'), ports(%s), socketLimit(%s), delayInMillis(%s), timeoutInMillis(%s), maxWorkersPerHost(%s), maxTargetsLimit(%s), showFilteredPorts(%s) %n", + targets, ports, socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, maxTargetsLimit, showFilteredPorts); - return new ScanOptions(targets.stream().toList(), socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, maxTargetsLimit, ports, showBlockedPorts); + return new ScanOptions(targets.stream().toList(), socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, maxTargetsLimit, ports, showFilteredPorts); } public void usageAndExit() { @@ -79,6 +79,7 @@ public class CliParser { --ports, -p:\t\tPorts to be scanned --maxWorkersPerHost, -wh:\tVirtual Worker Threads run per target. Higher doesn't mean necessarily faster. But the more you use the more RAM is required (Default: 1000) --maxTargetsLimit, -tl:\\tMax number of targets that are scanned at the same time (Default: 10) + --showFilteredPorts, -sf:\\\\tShow also filtered ports Examples: java -jar scanner.jar localhost diff --git a/src/main/java/com/it_jaros/network_scanner/PortState.java b/src/main/java/com/it_jaros/network_scanner/PortState.java @@ -3,5 +3,5 @@ package com.it_jaros.network_scanner; public enum PortState { OPEN, CLOSED, - BLOCKED + FILTERED } diff --git a/src/main/java/com/it_jaros/network_scanner/Progress.java b/src/main/java/com/it_jaros/network_scanner/Progress.java @@ -2,4 +2,4 @@ package com.it_jaros.network_scanner; import java.util.concurrent.atomic.AtomicInteger; -public record Progress(String host, int total, AtomicInteger done, AtomicInteger open, AtomicInteger blocked) {} -\ No newline at end of file +public record Progress(String host, int total, AtomicInteger done, AtomicInteger open, AtomicInteger filtered) {} +\ No newline at end of file diff --git a/src/main/java/com/it_jaros/network_scanner/ProgressBar.java b/src/main/java/com/it_jaros/network_scanner/ProgressBar.java @@ -59,12 +59,12 @@ public class ProgressBar { System.out.println(createBar( progress.host(), progress.open().get(), - progress.blocked().get(), + progress.filtered().get(), progress.done().get(), progress.total())); } - public String createBar(String label, int open, int blocked, int done, int total) { + public String createBar(String label, int open, int filtered, int done, int total) { int width = 30; double pct = total == 0 ? 1.0 : (done / (double) total); int filled = (int) (pct * width); @@ -72,7 +72,7 @@ public class ProgressBar { String brackets = "[" + "#".repeat(filled) + "-".repeat(width - filled) + "]"; int percent = (int) (pct * 100); - return String.format("%-40s open: %s blocked: %s %s %3d%% (%d/%d)", label, open, blocked, brackets, percent, done, total); + return String.format("%-40s open: %s filtered: %s %s %3d%% (%d/%d)", label, open, filtered, brackets, percent, done, total); } public void stop() { diff --git a/src/main/java/com/it_jaros/network_scanner/ScanOptions.java b/src/main/java/com/it_jaros/network_scanner/ScanOptions.java @@ -2,4 +2,4 @@ package com.it_jaros.network_scanner; import java.util.List; -public record ScanOptions(List<String> targets, int openSocketLimit, int delayInMillis, int timeoutInMillis, int maxWorkersPerHost, int maxTargetsLimit, String ports, boolean showBlockedPorts) {} +public record ScanOptions(List<String> targets, int openSocketLimit, int delayInMillis, int timeoutInMillis, int maxWorkersPerHost, int maxTargetsLimit, String ports, boolean showFilteredPorts) {} diff --git a/src/main/java/com/it_jaros/network_scanner/ScanResult.java b/src/main/java/com/it_jaros/network_scanner/ScanResult.java @@ -2,4 +2,4 @@ package com.it_jaros.network_scanner; import java.util.BitSet; -public record ScanResult(String target, BitSet openPorts, BitSet blockedPorts) {} +public record ScanResult(String target, BitSet openPorts, BitSet filteredPorts) {} diff --git a/src/main/java/com/it_jaros/network_scanner/Scanner.java b/src/main/java/com/it_jaros/network_scanner/Scanner.java @@ -74,7 +74,7 @@ public class Scanner { AtomicLong portSlotFactory = new AtomicLong(System.nanoTime()); Semaphore maxWorkers = new Semaphore(maxWorkersPerHost); BitSet openPorts = new BitSet(PortRange.MAX_PORT); - BitSet blockedPorts = new BitSet(PortRange.MAX_PORT); + BitSet filteredPorts = new BitSet(PortRange.MAX_PORT); Progress progress = new Progress(target, portRange.getTotal(), new AtomicInteger(), new AtomicInteger(), new AtomicInteger() ); progressBar.submit(progress); @@ -90,8 +90,8 @@ public class Scanner { PortState state = getPortState(target, currentPort); if (state.equals(PortState.OPEN)) { progress.open().incrementAndGet(); - } else if (state.equals(PortState.BLOCKED)) { - progress.blocked().incrementAndGet(); + } else if (state.equals(PortState.FILTERED)) { + progress.filtered().incrementAndGet(); } return new PortResult(currentPort, state); } finally { @@ -109,8 +109,8 @@ public class Scanner { PortResult portResult = f.get(); if (portResult.state().equals(PortState.OPEN)) { openPorts.set(portResult.port()); - } else if (portResult.state().equals(PortState.BLOCKED)) { - blockedPorts.set(portResult.port()); + } else if (portResult.state().equals(PortState.FILTERED)) { + filteredPorts.set(portResult.port()); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); @@ -124,7 +124,7 @@ public class Scanner { } } - return new ScanResult(target, openPorts, blockedPorts); + return new ScanResult(target, openPorts, filteredPorts); } private void waitForSlot(AtomicLong scanSlotFactory) { @@ -144,8 +144,10 @@ public class Scanner { return PortState.OPEN; } catch (NoRouteToHostException ignored) { // this can be safely ignored because the port is closed if a host is unreachable + } catch (SocketTimeoutException ignored) { + return PortState.FILTERED; } catch (ConnectException ignored) { - return PortState.BLOCKED; + return PortState.CLOSED; } catch (IOException ignored) { // Will happen a lot when scanning for open ports, so not needed } finally {