Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Lista Socket Aperte

  1. #1

    Lista Socket Aperte

    Salve compagni,
    continuando il progetto di un piccolo firewall a scopo didattico (ne avevo già parlato in un altro post), avrei bisogno di un piccolo aiuto.
    Avrei bisogno di ottenere una lista delle socket effettivamente attive.
    Non ho la più pallida idea di come fare.
    Potreste darmi un suggerimento?
    Grazie!

  2. #2
    Visto che è una cosa strettamente relativa al SO, Java non la implementa (almeno per un socket generico).
    Per conoscere il numero di socket TCP connessi, potresti scrivere un portscanner (qui c'è un esempio).
    lolide
    Java Programmer

    Informati

  3. #3
    Praticamente il mio obbiettivo è quello di bloccare qualsiasi connessione richiesta da un determinato indirizzo ip.
    Sono giunto a questa soluzione, ma sembra non funzionare.
    Non funziona per un semplice motivo.
    La ServerSocket lo impostata con porta 0, perchè dalla API Java, mi sembra di aver capito che in questo modo si metta in ascolto su tutte le porta ... o mi sbaglio???
    Questo è il risultato:

    codice:
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * La classe ConnectionIPGuard serve a gestire le connessione tentate da un particolare
     * indirizzo ip.
     * 
     */
    public class ConnectionIPGuard extends Thread{
    
    	private String ipAdress;
    	
    	public ConnectionIPGuard(String ipAdress) {
    		 this.ipAdress = ipAdress;
    	}
    	
    	/**
    	 * Sovrascrittura del metodo run() della classe Thread.
    	 * Permette di creare un flusso di esecuzione alla creazione di un oggetto 
    	 * della classe..
    	 * 
    	 * 
    	 * Il metodo si mette in ascolto sulle porte, terminando la connessione
    	 * dell'indirizzo ip non lecito.
    	 * 
    	 * 
    	 */
    	public void run() {
    
    		try {
    			int ports = 0;
    			
    			// Socket per l'intercettazione della socket sulle porte
    			ServerSocket socket = new ServerSocket(ports);
    
    			try {
    				// Ciclo infinito in modo da controllare ogni istante
    				// la nuova socket
    				while (true) {
    
    					// Accettazione della socketServer
    					Socket canal = socket.accept();
    					try {
    
    						/*
    						 * In caso di connessione al nostro Pc, il metodo
    						 * crea un oggetto di tipo ScannerSocket, in
    						 * modo da bloccare la socket e mostrare i dati del
    						 * malintenzionato.
    						 */
    						InetAddress ipAdressSocket = canal.getInetAddress();
    						String ipAdressSocketString = ipAdressSocket.toString();
    						
    						// Blocca la connessione esclusivamente dell'indirizzo ip specificato
    						if (this.ipAdress.compareToIgnoreCase(ipAdressSocketString) == 0) {
    							
    						new ScannerSocket(canal);
    						
    						}
    					} catch (IOException e) {
    
    						// Chiusura del collegamento e della socket aperta
    						canal.close();
    					}
    				}
    			} finally {
    				socket.close();
    			}
    		} catch (IOException e) {
    		}
    	}
    }
    Non riesco a creare la connessione, ovvero non so per esempio con telnet, su quale porta io debba connettermi.
    Ripeto, io vorrei che il server stessa allerta su qualsiasi porta!

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Imponendo la porta 0, la ServerSocket rimane in ascolto su tutte le porte libere, non su tutte le porte.

    A port of 0 creates a socket on any free port.
    Questo significa che se al momento della creazione della ServerSocket, la porta 23 è già usata da un altro servizio (telnet, in questo caso), la tua ServerSocket non rimarrà in ascolto su tale porta.

    Se, nel PC in cui stai lavorando, non vi è alcun servizio attivo su nessuna porta, allora la ServerSocket rimarrà in ascolto su tutte le porte. Quindi, effettuando una connessione telnet su una qualunque porta, risponderà il tuo programma.

    Telnet ti permette di scegliere tu su quale porta connetterti:

    codice:
    $ telnet indirizzo_ip port_num
    Effettua una connessione verso l'indirizzo indirizzo_ip sulla porta "port_num".

    Però, sinceramente, non ho capito la richiesta... se ti interessa avere l'elenco delle Socket aperte dalla tua applicazione, dovrai, ovviamente, aggiungerle ad una lista (ad esempio, ad un ArrayList<Socket>) nel momento in cui viene creata dalla accept().


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Grazie per la risposta, in realtà il mio obbiettivo è proprio ascoltare tutte le porte libere e "cacciare" un dato indirizzo ip.
    Tuttavia, non riesco a far funzionare la SocketServer, infatti se do':

    codice:
    telnet localhost num_qualsiasi
    Il risultato è:

    codice:
    Trying ::1...
    Trying 127.0.0.1...
    telnet: Unable to connect to remote host: Connection refused
    Cioè, non trova la porta aperta per intenderci!

    Eppure dovrebbe funzionare!

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da generalekamikaz
    Grazie per la risposta, in realtà il mio obbiettivo è proprio ascoltare tutte le porte libere e "cacciare" un dato indirizzo ip.
    Tuttavia, non riesco a far funzionare la SocketServer, infatti se do':

    codice:
    telnet localhost num_qualsiasi
    Il risultato è:

    codice:
    Trying ::1...
    Trying 127.0.0.1...
    telnet: Unable to connect to remote host: Connection refused
    Cioè, non trova la porta aperta per intenderci!

    Eppure dovrebbe funzionare!
    Io sono un cretino, perchè leggo senza "leggere".

    A port of 0 creates a socket on any free port.
    Traduzione con cervello: Una porta "0" crea una socket su una qualunque porta libera.

    Significato: crea una socket sulla prima porta libera che trova... non su ogni porta libera.

    E, infatti, se provi questo codice

    codice:
    ServerSocket server = new ServerSocket( 0 );
    System.out.println("Porta sulla quale sto in ascolto: " + server.getLocalPort());
    Vedrai che è in ascolto su una (sola) porta libera.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Okok, grazie mille per la risposta, ma allora come posso creare una SocketServer che accetti una connessione su qualsiasi porta???
    Nel senso che becca la prima connessione in arrivo???

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da generalekamikaz
    Okok, grazie mille per la risposta, ma allora come posso creare una SocketServer che accetti una connessione su qualsiasi porta???
    Nel senso che becca la prima connessione in arrivo???
    Non credo proprio sia possibile.
    Una socket può rimanere in ascolto solo su una porta.

    Non che abbia molto senso rimanere in ascolto su tutte le porte: ciascun servizio usa una porta... nessun servizio può "impossessarsi" di tutte le porte disponibili.

    Per questo non ha molto senso ciò che chiedi di fare: un firewall blocca l'accesso ad un determinato numero di porte... quelle per le quali è previsto un servizio. Se sulla porta X non c'è alcun servizio, non ha senso "bloccare" chi tenta di connettersi su quella porta per il semplice fatto che non ci riuscirà già di per se.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.