如何使用端口 1025-5000 作为临时端口来解决 WinXP 问题?

2024-04-19

如果您使用端口 0 而不是非零端口创建 TCP 客户端套接字,则操作系统会为您选择任何空闲的临时端口。大多数操作系统选择临时端口IANA 动态端口范围 http://www.iana.org/assignments/port-numbers49152-65535。然而,根据他们的说法,在 Windows Server 2003 及更早版本(包括 XP)中,Microsoft 使用端口 1025-5000 作为临时范围。绑定()文档 http://msdn.microsoft.com/en-us/library/ms737550%28VS.85%29.aspx.

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

Update:我在这方面已经取得了一些进展。微软似乎有一个保留端口的概念,这些端口是临时端口范围的例外。有一个注册表设置 http://www-12.lotus.com/ldd/doc/domino_notes/Rnext/help6_admin.nsf/0/680b13a91633dee585256c1d0039dd97?OpenDocument可以让你永久地改变它,显然必须有一个 API 来做同样的事情,因为有一个数据结构 http://msdn.microsoft.com/en-us/library/aa366383%28VS.85%29.aspx它保存了保留端口范围的高/低值,但我在任何地方都找不到实际的函数调用...注册表解决方案可能有效,但现在我专注于这个 API。

Update2:我接受了一个解决方案服务器故障 https://serverfault.com/questions/131974/how-can-i-make-winxp-bind-to-ports-other-than-1025-5000-for-outgoing-tcp-connecti了解如何通过 Windows 注册表执行此操作。我仍然想要一种通过 API 来完成此操作的方法,但我想我现在已经很满意了。


它不像使用操作系统对临时端口的支持那么优雅,但是docs http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#bind(java.net.SocketAddress)表明您应该能够为套接字指定要绑定的端口。在所需范围的基础上指定一个端口,如果使用它,将引发异常,在这种情况下,增加端口并重试。鉴于 Windows 没有使用您想要的端口范围,因此应该不会有太多冲突。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用端口 1025-5000 作为临时端口来解决 WinXP 问题? 的相关文章

随机推荐