如何使用端口1025-5000作为短暂的WinXP工作?

Chr*_*lan 6 java sockets windows

如果使用端口0而不是非零端口创建TCP客户端套接字,则操作系统会为您选择任何空闲的临时端口.大多数操作系统从IANA动态端口范围 49152-65535中选择短暂端口.但是,在Windows Server 2003及更早版本(包括XP)中,根据其bind()文档,Microsoft使用端口1025-5000作为临时范围.

我在同一硬件上运行多个Java服务.在极少数情况下,此范围与我用于其他服务的众所周知的端口(例如,端口4160用于Jini发现)相冲突.虽然很少见,但却造成了实际问题.有没有简单的方法告诉Windows或Java为客户端套接字使用不同的端口范围?微软的文档表明我可以通过MaxUserPort TcpIP注册表设置更改该范围的高端,但我认为没有办法改变低端.

更新:我在这方面取得了一些进展.看起来微软有一个保留端口的概念,它是短暂端口范围的例外.有一个注册表设置,允许你永久地更改它,显然必须有一个API来做同样的事情,因为有一个数据结构保存保留端口范围的高/低值,但我无法在任何地方找到实际的函数调用. ..注册表解决方案可能有效,但现在我已经注意到了这个API.

Update2:我在ServerFault上接受了一个解决方案,了解如何通过Windows注册表执行此操作.我仍然想通过API来做到这一点,但我想我现在很满意.

tor*_*rak 0

它不像使用操作系统对临时端口的支持那么优雅,但文档显示您应该能够为套接字指定要绑定的端口。在所需范围的基础上指定一个端口,如果使用它,将引发异常,在这种情况下,增加端口并重试。鉴于 Windows 没有使用您想要的端口范围,因此应该不会有太多冲突。