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

时间:2010-04-13 13:47:57

标签: java windows sockets

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

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

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

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

1 个答案:

答案 0 :(得分:0)

它不像使用OS支持临时端口那样优雅,但是docs表明你应该能够为你的套接字指定一个端口来绑定。在所需范围的基础上指定一个端口,如果使用它,将抛出异常,在这种情况下递增端口并重试。假设窗口没有使用您想要的端口范围,则不应该有很多冲突。