2012-10-27 6 views
5

Sto provando a creare un'app netowrk. Ho creato con successo un server che invia e riceve pacchetti. Finora, il test è stato eseguito su un computer che punta a 127.0.0.1 (Nessun posto come a casa). Ora voglio passare alla rete. Come posso trovare i computer su una rete LAN che ascoltano la mia porta specifica?Trovare la porta TCP aperta in una rete

+0

Dare l'IP di quella macchina invece di 127.0.0.1 – Adil

+0

Si sta solo preoccupando della sottorete o si desidera controllare i computer disponibili che potrebbero trovarsi in altre sottoreti? –

+0

Sì, ma la mia domanda è trovare porte effettive. In questo modo posso usarlo senza IP codificato IP – Samyn

risposta

4

Il servizio sarà bisogno di ascoltare per broadcast messages su una porta conosciuta (se si vuole essere davvero ben educati si può register the program and port number with the IANA), quando sente un messaggio broadcast si risponde al mittente IP e quale porta il servizio è del server ascoltando le connessioni in arrivo su.

Ecco un semplice esempio dal collegamento sopra riportato, che viene stampato sulla console che ha effettuato la connessione e su quale porta, ma è possibile utilizzare queste informazioni per stabilire una connessione TCP o UDP tra i due endpoint.

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 
class RecvBroadcst 
{ 
    public static void Main() 
    { 
    Socket sock = new Socket(AddressFamily.InterNetwork, 
      SocketType.Dgram, ProtocolType.Udp); 
    IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); 
    sock.Bind(iep); 
    EndPoint ep = (EndPoint)iep; 
    Console.WriteLine("Ready to receive…"); 
    byte[] data = new byte[1024]; 
    int recv = sock.ReceiveFrom(data, ref ep); 
    string stringData = Encoding.ASCII.GetString(data, 0, recv); 
    Console.WriteLine("received: {0} from: {1}", 
       stringData, ep.ToString()); 
    data = new byte[1024]; 
    recv = sock.ReceiveFrom(data, ref ep); 
    stringData = Encoding.ASCII.GetString(data, 0, recv); 
    Console.WriteLine("received: {0} from: {1}", 
       stringData, ep.ToString()); 
    sock.Close(); 
    } 
} 

Come esempio psudo Ecco la sequenza di eventi su come lo farei.

Per questo esempio, diciamo che abbiamo una rete con un IP di 192.168.1.0 e una sottorete di 255.255.255.0. Abbiamo due server, Server1 allo 192.168.1.2 con il servizio di ascolto sulla porta 1234 e Server2 allo 192.168.1.3 con una porta di 4567 per il servizio. Entrambi sono elencati sulla porta 3000 per i messaggi broadcast. Il client che si connette sarà al IP 192.168.1.4

  1. cliente sceglie una porta casuale nel dynamic port range (49.152-65.535) e si lega ad esso su UDP (porta 5per questo esempio) e ascolta.
  2. Il client trasmette all'indirizzo broadcast e alla porta conosciuta per la sua subnet locale (192.168.1.255:3000) utilizzando la stessa porta da inviare mentre è in ascolto. Invia una specie di carico utile in modo che i server inviino solo ai tuoi clienti, invece di qualcun altro che ha utilizzato la stessa porta come te. (diciamo che invia la stringa Send me your info for XYZ app!)
  3. Server1 riceve la trasmissione. Controlla che il messaggio è Send me your info for XYZ app! e invia il messaggio UDP Name:Server1 IP:192.168.1.2 Port:1234 indietro al porto mittenti fonte e la combinazione IP (192.168.1.4:50123)
  4. Server2 riceve la trasmissione anche. Controlla che il messaggio è Send me your info for XYZ app! e invia il messaggio Name:Server2 IP:192.168.1.3 Port:4567 messaggio UDP di nuovo alla porta di mittenti fonte e la combinazione IP (192.168.1.4:50123)
  5. Il cliente riceve due messaggi UDP sulla stessa porta ha inviato il messaggio. Analizza le risposte e visualizza all'utente i due server disponibili per la connessione.