2010-11-06 9 views
5

Sto creando un'applicazione client server usando c sharp. Il server sta usando tcplistener con un numero di porta fisso. il client si connette al server usando tcpclient. Una volta connessi, sia il client che il server comunicano utilizzando questa connessione. L'applicazione crea quindi una nuova connessione udp per inviare e ricevere messaggi. Dal momento che il server suppone di accettare una connessione multipla da un singolo client, devo differenziare ogni connessione con una porta diversa. Per fare ciò, devo prima chiamare 1. sul server, creare un udpclient (usare automaticamente la porta udp inutilizzata sul server). 2. invia il numero di porta utilizzato dal server udpclient al client. 3. il client invia i dati al server utilizzando il numero di porta specificato.Come conoscere il numero di porta utilizzato da C# UdpClient?

Il problema è, come creare un udpclient in cui è possibile conoscere il numero di porta utilizzato?

risposta

12

Ecco la risposta alle mie domande.

UdpClient udpClient = new UdpClient(0)); 
Console.WriteLine("UDP port : " + ((IPEndPoint)udpClient.Client.LocalEndPoint).Port.ToString()); 

0 come il constru Parametro Ctor imposta l'app per trovare automaticamente la porta udp gratuita. ((IPEndPoint)udpClient.Client.LocalEndPoint)).Port.ToString() viene utilizzato per trovare il numero di porta.

+0

Purtroppo, almeno in .NET 4.0, il sistema non imposta mai il campo Porta di un socket UDP. E poiché si tratta di una proprietà get-only, non è possibile impostarla manualmente. –

+0

OOPS. Avrei dovuto dire: il sistema non imposta la porta su socket UDP RAW quando si esegue il binding. lo fa su DGRAM Sockets. –

0

Penso che non sia possibile utilizzare UdpClient sul lato server per raggiungere l'obiettivo, poiché non ha un metodo Bind per collegarsi a un IPEndPoint.

È necessario utilizzare un oggetto Socket per eseguire tale operazione, che consente di monitorare una porta per i messaggi UDP in entrata. Quindi, senza dubbio, puoi dire al client su quale porta sono monitorati i server.

2

Credo che sia possibile utilizzare la proprietà Socket.RemoteEndPoint per sapere qual è l'IP/Porta del client connesso al server (si conosce l'IP/porta locale perché è stato avviato il socket su quella porta, ma è anche disponibile tramite la proprietà LocalEndPoint.

anche vedere il MSDN UdpClient per un semplice esempio su come utilizzare la classe UdpClient correttamente.