Velocizzare scansione con Socket

di il
2 risposte

Velocizzare scansione con Socket

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

  • Re: Velocizzare scansione con Socket

    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ì ...
  • Re: Velocizzare scansione con Socket

    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