Если вы создаете 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, но я думаю, что пока что доволен.