Как только вы начинаете слушать на незанятый порт (0), то он будет назначен операционной системой (или, точнее, в/стек TCP IP). Поскольку стек управляет всеми портами, он может назначить бесплатный.
Так что просто начните слушать свое соединение, а затем проверьте порт в свойстве LocalEndpoint, чтобы передать его клиенту. TcpListener documentation содержит дополнительную информацию об этом.
Если вам нужно найти бесплатный в диапазоне, вам просто нужно пройти весь диапазон и попытаться начать прослушивание на каждом из них. Если вам это удастся, вы нашли свободный порт, и вы можете выйти из цикла; если нет, просто продолжайте цикл. Это единственный надежный способ сделать это, потому что в противном случае вы можете столкнуться с состоянием гонки с другими процессами или даже с вашими потоками, которые оценивают один и тот же свободный порт, а первый - «выигрывает», в то время как другой код не будет способный использовать порт.
Возможный дубликат [Найти следующий TCP-порт в .Net] (http://stackoverflow.com/questions/138043/find-the-next-tcp-port-in-net) –