diff options
Diffstat (limited to 'src/main/java/com/it_jaros/networkScanner/Scanner.java')
| -rw-r--r-- | src/main/java/com/it_jaros/networkScanner/Scanner.java | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/main/java/com/it_jaros/networkScanner/Scanner.java b/src/main/java/com/it_jaros/networkScanner/Scanner.java new file mode 100644 index 0000000..1f71f56 --- /dev/null +++ b/src/main/java/com/it_jaros/networkScanner/Scanner.java @@ -0,0 +1,50 @@ +package com.it_jaros.networkScanner; + +import java.io.IOException; +import java.net.ConnectException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.util.List; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +public class Scanner { + + private Counter counter = new Counter(); + private final int socketLimitDefault = 1024; + + public Scanner() {} + + public List<Integer> scanPorts(String address) { + return scanPorts(address, socketLimitDefault); + } + + public List<Integer> scanPorts(String address, int socketLimit) { + Queue<Integer> openPorts = new ConcurrentLinkedQueue<>(); + Semaphore socketCap = new Semaphore(socketLimit); + try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) { + for (int port = 1; port < 65536; port++) { + final int currentPort = port; + executor.submit(() -> { + socketCap.acquireUninterruptibly(); + counter.inc(); + try (Socket socket = new Socket()) { + socket.connect(new InetSocketAddress(address, currentPort)); + openPorts.add(currentPort); + } catch (ConnectException ignored) { + } catch (IOException e) { + System.out.println(e.getClass().getSimpleName() + ": " + e.getMessage()); + } finally { + counter.dec(); + socketCap.release(); + } + }); + } + } + System.out.println("Peak concurrent connects: " + counter.max()); + return openPorts.stream().toList(); + } +} |
