Найдите франко-порт

Я пишу библиотеку FTP-сервера (потому что мне нужна она, и я не могу найти хорошие решения для этого) в C#, и у меня есть два вопроса:

  • Как делает IPEndPoint найдите франко-порт, когда я сделаю new IPEndPoint(IPAddress.Any, 0), например?

  • Действительно ли возможно найти франко-порт от диапазона (например, от 1 023 до 65 535), без GetActiveTcpConnections метод? Поскольку это медленно - мне нужен более быстрый способ сделать это.

8
задан Danny Beckett 10 April 2013 в 02:16
поделиться

1 ответ

Как только вы начнете прослушивать неназначенный порт (0), он будет назначен операционной системой (или, точнее, стеком TCP / IP. ). Поскольку стек управляет всеми портами, он может назначить свободный.

Просто начните прослушивать ваше соединение, а затем проверьте порт в свойстве LocalEndpoint , чтобы передать его клиенту. Дополнительная информация об этом содержится в документации TcpListener .

Если вам нужно найти свободный в диапазоне, вам просто нужно перебрать весь диапазон и попытаться начать прослушивание каждого из них. Если вам это удалось, вы нашли свободный порт и можете выйти из цикла; если нет, просто продолжайте цикл. Это единственный надежный способ сделать это, потому что в противном случае вы можете столкнуться с состоянием гонки с другими процессами или даже вашими потоками, которые оба оценивают один и тот же свободный порт, и первый, кто его использует, «выигрывает», в то время как другой код не будет может использовать порт.

15
ответ дан 5 December 2019 в 11:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: