Я пишу библиотеку FTP-сервера (потому что мне нужна она, и я не могу найти хорошие решения для этого) в C#, и у меня есть два вопроса:
Как делает IPEndPoint
найдите франко-порт, когда я сделаю new IPEndPoint(IPAddress.Any, 0)
, например?
Действительно ли возможно найти франко-порт от диапазона (например, от 1 023 до 65 535), без GetActiveTcpConnections
метод? Поскольку это медленно - мне нужен более быстрый способ сделать это.
Как только вы начнете прослушивать неназначенный порт (0), он будет назначен операционной системой (или, точнее, стеком TCP / IP. ). Поскольку стек управляет всеми портами, он может назначить свободный.
Просто начните прослушивать ваше соединение, а затем проверьте порт в свойстве LocalEndpoint , чтобы передать его клиенту. Дополнительная информация об этом содержится в документации TcpListener .
Если вам нужно найти свободный в диапазоне, вам просто нужно перебрать весь диапазон и попытаться начать прослушивание каждого из них. Если вам это удалось, вы нашли свободный порт и можете выйти из цикла; если нет, просто продолжайте цикл. Это единственный надежный способ сделать это, потому что в противном случае вы можете столкнуться с состоянием гонки с другими процессами или даже вашими потоками, которые оба оценивают один и тот же свободный порт, и первый, кто его использует, «выигрывает», в то время как другой код не будет может использовать порт.