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 | 71 |
1 files changed, 42 insertions, 29 deletions
diff --git a/src/main/java/com/it_jaros/networkScanner/Scanner.java b/src/main/java/com/it_jaros/networkScanner/Scanner.java index 51d5373..7fe14a1 100644 --- a/src/main/java/com/it_jaros/networkScanner/Scanner.java +++ b/src/main/java/com/it_jaros/networkScanner/Scanner.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.net.ConnectException; import java.net.InetSocketAddress; import java.net.Socket; +import java.util.ArrayList; import java.util.List; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; @@ -17,44 +18,56 @@ import java.util.concurrent.locks.LockSupport; public class Scanner { private Counter counter = new Counter(); + private Semaphore socketCap; + public Scanner(int socketLimit) { + socketCap = new Semaphore(socketLimit); + } + public Scanner() {} - public List<Integer> scanPorts(ScanTarget - target) { - return scanPorts(target.address(), target.openSocketLimit(), target.delayInMillis()); + public List<ScanResult> scanPorts(ScanOptions target) { + return scanPorts(target.targets(), target.delayInMillis()); } - public List<Integer> scanPorts(String address, int socketLimit, int delayInMillis) { - Queue<Integer> openPorts = new ConcurrentLinkedQueue<>(); - Semaphore socketCap = new Semaphore(socketLimit); + public List<ScanResult> scanPorts(List<String> targets, int delayInMillis) { + List<ScanResult> results = new ArrayList<>(); long delayInNanos = TimeUnit.MILLISECONDS.toNanos(Math.max(0, delayInMillis)); - AtomicLong nextStartNanos = new AtomicLong(System.nanoTime()); try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) { - for (int port = 1; port < 65536; port++) { - final int currentPort = port; - executor.submit(() -> { - if (delayInNanos > 0) { - long mySlot = nextStartNanos.getAndAdd(delayInNanos); - long wait = mySlot - System.nanoTime(); - if (wait > 0) LockSupport.parkNanos(wait); - } - 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(); - } - }); + for (String target : targets) { + results.add(scanTargetAsync(target, delayInNanos, executor)); } } System.out.println("Peak concurrent connects: " + counter.max()); - return openPorts.stream().toList(); + return results; + } + + private ScanResult scanTargetAsync(String target, long delayInNanos, ExecutorService executor) { + AtomicLong nextStartNanos = new AtomicLong(System.nanoTime()); + Queue<Integer> openPorts = new ConcurrentLinkedQueue<>(); + for (int port = 1; port < 65536; port++) { + final int currentPort = port; + executor.submit(() -> { + if (delayInNanos > 0) { + long mySlot = nextStartNanos.getAndAdd(delayInNanos); + long wait = mySlot - System.nanoTime(); + if (wait > 0) + LockSupport.parkNanos(wait); + } + socketCap.acquireUninterruptibly(); + counter.inc(); + try (Socket socket = new Socket()) { + socket.connect(new InetSocketAddress(target, currentPort)); + openPorts.add(currentPort); + } catch (ConnectException ignored) { + } catch (IOException e) { + System.out.println(e.getClass().getSimpleName() + ": " + e.getMessage()); + } finally { + counter.dec(); + socketCap.release(); + } + }); + } + return new ScanResult(target, openPorts); } } |
