Найти свободный порт - PullRequest
8 голосов
/ 16 марта 2010

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

  • Как IPEndPoint находит свободный порт, когда я, например, new IPEndPoint(IPAddress.Any, 0)?

  • Можно ли найти свободный порт из диапазона (например, от 1023 до 65535), без метода GetActiveTcpConnections? Потому что это медленно - мне нужен более быстрый способ сделать это.

1 Ответ

13 голосов
/ 16 марта 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...