Если Вы создаете сокет клиента 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, но я предполагаю, что удовлетворен на данный момент.
Это не так элегантно, как использование поддержки ОС для эфемерных портов, но docs показывают, что вы должны иметь возможность указать порт для привязки сокета. Укажите порт в основании нужного вам диапазона, и если он будет использован, возникнет исключение, в этом случае увеличьте порт и повторите попытку. Учитывая, что windows не использует нужный вам диапазон портов, коллизий быть не должно.