Как я могу обойти WinXP, используя порты 1025-5000 как эфемерные? - PullRequest
6 голосов
/ 13 апреля 2010

Если вы создаете TCP-клиентский сокет с портом 0 вместо ненулевого порта, то операционная система выбирает любой свободный эфемерный порт для вас. Большинство операционных систем выбирают временные порты из диапазона динамических портов IANA 49152-65535. Однако в Windows Server 2003 и более ранних версиях (включая XP) Microsoft использовала порты 1025-5000 в качестве промежуточного диапазона, согласно их bind () документации .

Я запускаю несколько служб Java на одном и том же оборудовании. В редких случаях этот диапазон сталкивается с хорошо известными портами, которые я использую для других служб (например, порт 4160 для обнаружения Jini). Хотя это и редкость, это вызывает реальные проблемы. Есть ли простой способ сказать Windows или Java использовать другой диапазон портов для клиентских сокетов? Документы Microsoft указывают, что я могу изменить верхний предел этого диапазона с помощью параметра реестра MaxUserPort TcpIP, но я не вижу способа изменить нижний предел.

Обновление: Я достиг определенного прогресса в этом. Похоже, что у Microsoft есть концепция зарезервированных портов, которые являются исключениями из эфемерного диапазона портов. Есть параметр реестра , который позволяет вам изменить это навсегда, и, очевидно, должен существовать API для того же, потому что есть структура данных , которая содержит высокие / низкие значения для зарезервированных диапазонов портов, но я нигде не могу найти фактический вызов функции ... Решение для реестра может работать, но теперь я зациклен на этом API.

Обновление 2: Я принял решение на ServerFault , как это сделать через реестр Windows. Я все еще хотел бы сделать это через API, но я думаю, что пока что доволен.

1 Ответ

0 голосов
/ 13 апреля 2010

Это не так элегантно, как использование поддержки ОС для эфемерных портов, но документы показывают, что вы должны быть в состоянии указать порт для вашего сокета, к которому он будет привязан. Укажите порт в базе требуемого диапазона, и, если он используется, будет сгенерировано исключение, в этом случае увеличьте порт и попробуйте снова. Учитывая, что окна не используют требуемый диапазон портов, коллизий не должно быть много.

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