summaryrefslogtreecommitdiff
path: root/src/main/java/com/it_jaros/networkScanner/Scanner.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/it_jaros/networkScanner/Scanner.java')
-rw-r--r--src/main/java/com/it_jaros/networkScanner/Scanner.java71
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);
}
}