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
risposta
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
- 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.
- 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 stringaSend me your info for XYZ app!
) - Server1 riceve la trasmissione. Controlla che il messaggio è
Send me your info for XYZ app!
e invia il messaggio UDPName:Server1 IP:192.168.1.2 Port:1234
indietro al porto mittenti fonte e la combinazione IP (192.168.1.4:50123
) - Server2 riceve la trasmissione anche. Controlla che il messaggio è
Send me your info for XYZ app!
e invia il messaggioName: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
) - 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.
Dare l'IP di quella macchina invece di 127.0.0.1 – Adil
Si sta solo preoccupando della sottorete o si desidera controllare i computer disponibili che potrebbero trovarsi in altre sottoreti? –
Sì, ma la mia domanda è trovare porte effettive. In questo modo posso usarlo senza IP codificato IP – Samyn