2012-03-08 13 views
7

Attualmente sto lavorando su una piccola utility di chat in C#.
Il problema è che non riesco a capire come scansionare la rete per una porta specifica su tutte le macchine. Attualmente sto usando questo metodoCome cercare una porta in attesa di una connessione su una rete

IPGlobalProperties network = IPGlobalProperties.GetIPGlobalProperties(); 
    IEnumerable<IPEndPoint> connections = network.GetActiveTcpListeners() 
                 .Where(x => x.Port == ConstParams.iPort); 

dove ConstParams.iPort è la porta che voglio per la scansione (6910 qui).

Il problema è che i valori restituiti sono solo le porte locali e la "0.0.0.0" indirizzo ip ...

Come posso eseguire la scansione di tutte le porte aperte (6910) sulla rete attuale?

+1

Guardando nella descrizione di come * * nmap opere possono essere d'aiuto. –

risposta

9

Invece di utilizzare la scansione delle porte, vi suggerisco di implementare un semplice meccanismo di scoperta sulla base di multicast/comunicazione broadcast.

Durante l'avvio l'applicazione dovrebbe trasmettere/multicastare le sue informazioni IP/Port. Tutte le istanze in esecuzione dovrebbero rispondere a questo messaggio con le loro informazioni IP/Port. Questo tipo di meccanismo di scoperta è facile da implementare ed è più veloce in runtime e più dinamico rispetto all'approccio di scansione delle porte.

+0

Puoi mostrare qualche esempio? – rkmax

0

GetIPGlobalProperties restituisce solo informazioni sulla macchina locale (vedere http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipglobalproperties.getipglobalproperties.aspx).

Per scoprire quali altre macchine sulla rete hanno quella porta aperta, è necessario eseguire un'iterazione attraverso un intervallo di IP, tentando di connettersi su quella porta. Non esiste un repository centrale per interrogare su questo.

Questo articolo descrive un approccio: http://www.dijksterhuis.org/building-a-simple-portscanner-in-c/

1

Le porte di scansione sono una scelta sbagliata, molto probabilmente attiverai i firewall sulle macchine della rete per visualizzare la tua macchina come un malintenzionato. Potrebbero essere attivati ​​anche eventuali sistemi di rilevamento delle intrusioni sulle reti. È un sacco di spese generali per quello che ti serve.

Suggerirei di fare una trasmissione utilizzando UDP o un multicast per scoprire altri clienti http://www.codeproject.com/Articles/1705/IP-Multicasting-in-C

Un'altra opzione sarebbe quella di avere un server centralizzato, sia su un server web (script php, pagina asp.net, ecc) o un servizio web (REST) ​​al quale il client di chat si connetterebbe all'avvio, POSTando l'IP/Port di ascolto, e quindi a sua volta riceverà un elenco di tutti gli IP/Ports recentemente annunciati degli altri client sulla rete. Probabilmente vorrai restare in vita qui, IE: il client POSTà la pagina ogni 5 minuti, se un IP non esegue il POST per 10 minuti, verrebbe rimosso dall'elenco.

Per ottenere l'IP pubblico della macchina, si potrebbe verificare questa pagina: http://www.whatismyip.com/faq/automation.asp

Faresti solo bisogno di inviare una richiesta web ad esso per recuperare l'IP. Se vuoi ottenere il non 0.0.0.0/127.0.0.1 IP dell'interfaccia locale, è possibile controllare questi posti:

Get local IP address

How do I get the Local Network IP address of a computer programmatically? (C#)