Ps1

PortScanner.java

/**
 * @(#)PortScanner.java
 *
 *
 * @author - FRANCESCO SERAFINO
 * @version 1.0 2008/12/16
 */
 
/*Importazione pacchetti*/
import java.net.*;
import java.io.*;
 
/*Programma principale*/
public class PortScanner
{
    public static void main(String[] args)
    {
        int n = 1000;            //n = numero dei thread che scansionano le porte (default 1000)
        Scan s = new Scan();    //oggetto Scan che gestisce ogni porta da scansionare
 
        for (int i = 0; i < n; i++)        //ciclo for per creare gli n thread
        {
            Controllore v = new Controllore(s, i);    //crea il thread passandogli lo Scan e il nome
            v.start();                                //avvia il thread
        }
        System.out.println("Tutti i " + n + " Thread sono stati avviati!");        //avvisa l'utente quando tutti i thread sono avviati
      } 
} // Esce dal Main
 
/*Ogni thread e' rappresentato da istanze della classe Controllore */ 
class Controllore extends Thread
{
    private Scan scanner;
    int name;
    int porta = 0;            //e' la porta corrente su cui fare il controllo
 
    public Controllore(Scan s, int i)
    {
        scanner = s;
        name = i;
    }
 
    public void run()            //avvia il thread
    {
        String host = "localhost";            //host su cui effettuare il controllo delle porte (default localhost)
        Socket connection = null;            //socket inizializzata a null
        porta = scanner.getNextPort();        //chiede alla classe Scan qual'e' la porta successiva da analizzare
        while (porta != -1)                 //porta e' uguale a -1 se sono finite le porte da scansionare
        {
            /*Il seguente codice e' prelevato dal file PortScanner dell'esercitazione LAB04 e adattato ai thread*/
            try 
            {
                  InetAddress theAddress = InetAddress.getByName(host);        
                  try
                  {
                      connection = new Socket(host, porta);        
                      System.out.println("C'e' un server sulla porta " + porta + " dell'host " + host + " trovato dal thread: " + name);
                }
                catch (IOException e)
                {
                      // must not be a server on this port
                }
            } // end try
            catch (UnknownHostException e)
            {
                  System.err.println(e);
            }
            finally
            {
                  try
                  {
                    if (connection != null) connection.close( );
                  }
                  catch (IOException e){}
            }
            /*Fine del codice del PortScanner originario*/
            porta = scanner.getNextPort();    //chiede alla classe Scan qual'e' la porta successiva da analizzare
        }
    }   
}
 
/*Classe che fa da Monitor per i vari Thread e affida le porte ai thread*/
class Scan
{
    public int porte = 0;        //variabile che imposta le porte controllate a 0
    public int next = 10000;        //variabile che serve ad avvisare l'utente del progresso ogni 10000 porte
 
    public Scan()
    {
        //Costruttore vuoto
    }
 
    /*Restituisce al thread chiamante la successiva porta da analizzare*/
    public synchronized int getNextPort()
    {        
        if (porte < 65536) 
        {
            porte = porte + 1;
            if (porte == next)
            {
                System.out.println(porte + "/65535 porte controllate.");
                next = next + 10000;
            }
            else
            {
                if (porte == 65535)            //se le porte sono state controllate tutte, stampa un messaggio di fine programma e termina
                {
                    System.out.println("65535/65535 porte controllate.");
                    System.out.println("Bye.");
                }
            }
            return porte - 1;        
        }
        else
        {
            return -1;        //restituisce -1 se le porte sono finite cioe' quando arrivano a 65536
        }
    }
}
 
/* NOTE:
 *
 * Utilizzando Windows:
 * Il programma originale che affidava la scansione ad un solo thread, controllava una porta al secondo e quindi impiegava circa 18 ore stimate
 * per effettuare la scansione, mentre affidando il lavoro a 1000 thread il tempo di attesa si e' ridotto a circa 65 secondi
 * cioe' controlla 10000 porte al secondo.
 *
 * Utilizzando Ubuntu:
 * Sia il programma che affida la scansione ad un solo thread, che questo programma che lavora con 1000 thread impiega circa 6 secondi per
 * effettuare l'intera scansione delle porte.
 *
 * Entrambe le verifiche sono state effettuate sullo stesso PC.
 */
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License