2010-03-16 7 views
8

sto scrivendo una libreria server FTP (perché ne ho bisogno e non riesco a trovare nessuna buone soluzioni per questo) in C# e ho due domande:Trova un porto franco

  • Come funziona IPEndPoint trovare una porta libera quando faccio new IPEndPoint(IPAddress.Any, 0), ad esempio?

  • E 'possibile trovare un porto franco da un intervallo (ad esempio 1.023-65.535), senza il metodo GetActiveTcpConnections? Perché è lento - ho bisogno di un modo più veloce per farlo.

+1

possibile duplicato di [Trova la successiva porta TCP in .Net] (http://stackoverflow.com/questions/138043/find-the-next-tcp-port-in-net) –

risposta

13

Non appena si inizia ad ascoltare su una porta non assegnata (0), sarà assegnato dal sistema operativo (o, più precisamente, dallo stack TCP/IP). Poiché lo stack gestisce tutte le porte, può assegnarne uno gratuito.

Quindi, basta iniziare ad ascoltare sulla connessione e quindi controllare la porta nella proprietà LocalEndpoint per passarla al client. TcpListener documentation contiene ulteriori informazioni a riguardo.

Se è necessario trovare uno libero in un intervallo, è sufficiente scorrere l'intera gamma e provare ad avviare l'ascolto su ciascuno di essi. Se ci riesci, hai trovato una porta libera e puoi uscire dal tuo loop; in caso contrario, continua con il ciclo. Questo è l'unico modo affidabile per farlo perché altrimenti si può correre in una condizione di competizione con altri processi o persino thread del tuo che valutano entrambi la stessa porta libera e il primo ad usarlo "vince", mentre l'altro codice non sarà in grado di utilizzare la porta.

Problemi correlati