Как только вы начнете прослушивать неназначенный порт (0), он будет назначен операционной системой (или, точнее, стеком TCP / IP). Поскольку стек управляет всеми портами, он может назначить свободный.
Так что просто начните прослушивать ваше соединение, а затем проверьте порт в свойстве LocalEndpoint , чтобы передать его клиенту. Документация TcpListener содержит дополнительную информацию об этом.
Если вам нужно найти свободный в диапазоне, вам просто нужно пройтись по всему диапазону и попытаться начать прослушивание каждого из них. Если вам это удастся, вы нашли свободный порт и можете выйти из цикла; если нет, просто продолжайте цикл. Это единственный надежный способ сделать это, потому что в противном случае вы можете столкнуться с состоянием гонки с другими процессами или даже вашими потоками, которые оба оценивают один и тот же свободный порт, и первый, кто его использует, «выигрывает», тогда как другой код не будет возможность использовать порт.