Velocizzare scansione con Socket

di fermat il
2 risposte
Ciao!

stavo cercando di usare Socket per scannerizzare le porte aperte su un determinato IP.
lo sto facendo a titolo didattico.

al momento ho questo:

import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class Main {

    public static void main(String[] args) {
        String ip = "192.168.1.185";
        System.out.println("===Scanning " + ip + "===");
        try {
            ExecutorService es = Executors.newFixedThreadPool(10);
            int timeout = 200;
            List<Future<ScannerResult>> list = new ArrayList<>();
            for (int port = 1; port <= 65535; port++) {
                list.add(portOpened(es, ip, port, timeout));
            }
            es.shutdown();
            int openPorts = 0;
            for (final Future<ScannerResult> f : list) {
                if (f.get().isOpen()) {
                    openPorts++;
                    System.out.println(f.get().getPort());
                }
            }
            System.out.println("L'indirizzo " + ip + " ha " + openPorts + " porte aperte");
        } catch (InterruptedException | ExecutionException ex) {
            System.out.println(ex.getMessage());
        }
        System.out.println("===END===");
    }

    public static Future<ScannerResult> portOpened(ExecutorService es, String ip, int port, int timeout) {
        return es.submit(() -> {
            try {
                Socket socket = new Socket();
                socket.connect(new InetSocketAddress(ip, port), timeout);
                socket.close();
                return new ScannerResult(port, true);
            } catch (Exception ex) {
                return new ScannerResult(port, false);
            }
        });
    }
}
per eseguire il programma ci sono voluti circa 2 minuti e mezzo.
ma su un solo indirizzo IP!
e su una macchina molto corazzata.
secondo voi è normale, o è possibile velocizzare la scansione??

PS: lo so che esiste nmap, non c'è bisogno che me lo diciate!

2 Risposte

  • fermat ha scritto:


    secondo voi è normale, o è possibile velocizzare la scansione??
    Beh, intanto c'è una considerazione da fare: perché hai messo "solo" 10 per il thread-pool?
    Se i thread sono molto "CPU bound", ovvero fanno principalmente computazioni e quindi "occupano" molta CPU, se hai es. 4 core, la concorrenza "giusta" e ragionevole è proprio ... 4. Andare molto oltre (es. 30) non darebbe alcun beneficio, anzi ci sarebbe maggior context-switch tra thread e sarebbe anche peggio.
    Ma se i thread sono invece molto "I/O bound", ovvero stanno molto bloccati su I/O, allora occupano poca CPU. E questo è proprio il caso di un port-scanner, perché il "grosso" del tempo i thread lo passano in "sospensione" in quel socket.connect().
    Questo in sostanza vuol dire che puoi scalare molto sul numero di thread, anche, 50, 100, 150 o giù di lì ...
  • Ciao andbin!

    in effetti mettendoci 100 ci ha messo circa 25 secondi!

    non sapevo bene la differenza che mi hai spiegato, quindi non volevo esagerare.
    mi vado a documentare meglio.

    grazie!
Devi accedere o registrarti per scrivere nel forum
2 risposte