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

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

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

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

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

6
задан Community 13 April 2017 в 12:13
поделиться

1 ответ

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

0
ответ дан 18 December 2019 в 04:49
поделиться
Другие вопросы по тегам:

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