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