【发布时间】:2011-07-12 09:04:51
【问题描述】:
我想保留一个 TCP 端口,以便稍后由服务绑定,以便 Windows 在分配随机端口号时不会无意中使用相同的端口号。我知道这可以通过注册表和重新启动来实现,但我想避免这种笨拙的解决方案。
进程如何在不实际绑定/侦听端口的情况下保留端口,然后根据请求安全地(即避免竞争条件)将其移交给另一个进程?
端口号无需提前确定。第一个进程可以获取一个随机端口号,并传递给请求进程。
编辑: 我突然想到我的问题表述得有些不好。我真正想要的是将动态端口号的分配与绑定到端口零操作分开。这意味着不仅要避免意外随机分配该端口号,还要防止任何其他进程在此期间绑定到同一地址/端口。或者,换一种说法,我希望一个进程启动绑定到端口零的操作——立即了解将使用的端口号——并让指定的第二个进程在未来某个时间完成绑定操作。
目前,我能想到的最接近的解决方法是让第一个进程立即绑定到 address/0,并保持绑定直到第二个进程请求它,此时它解除绑定并告诉另一个进程它获取的端口号,然后显式绑定到地址/端口。这有两个问题:1)我宁愿在第二个过程出现之前根本不绑定; 2) 有一小段时间间隔,在此期间第三方可能会意外(或故意)篡夺端口。
背景
你可能会好奇我为什么要做这么奇怪的事情。我一直在玩弄 ZeroMQ,一个主要的限制是 Windows 上没有 ipc:// 传输。让我感到震惊的是,端口映射器进程(类似于 RPC 端点映射器,或 Erlang 的 epmd)只是使用带有动态端口分配的tcp:// 传输实现变通方案的门票。但是,ZeroMQ 客户端和服务器允许无序连接(即,客户端在服务器绑定之前连接不是错误),所以我试图弄清楚连接客户端如何发现 - 非常高度确定性——在服务器实际绑定到该端口之前,将用于通信的端口。
【问题讨论】:
-
请注意,Windows 确实支持大致相当于 Unix 套接字的东西,它被称为“命名管道”(流和消息/数据报模式都可用)。所以最好的解决方案可能是在 Win32 上实现“ipc:”。
-
@BenVoigt 感谢您的建议。不幸的是,命名管道的语义与套接字有很大的不同,以至于大多数应用程序不能将它们用作直接替代品。
标签: windows network-programming zeromq