我想保留一个 TCP 端口,以便稍后由服务绑定,以便 Windows 在分配随机端口号时不会无意中使用相同的数字。我知道这可以通过注册表和重新启动来实现,但我想避免这种笨拙的解决方案。
一个进程如何在没有实际绑定/监听的情况下保留一个端口,然后根据请求安全地(即避免竞争条件)将其移交给另一个进程?
端口号不需要预先确定。第一个进程可以获取一个随机端口号,并将其传递给请求进程。
编辑:在我看来,我的问题表述得有些不好。我真正想要的是将动态端口号的分配与绑定到端口零操作分开。这意味着不仅要避免意外随机分配该端口号,还要防止任何其他进程在此期间绑定到同一地址/端口。或者,换一种说法,我希望一个进程启动绑定到端口零的操作——立即了解将使用的端口号——并让指定的第二个进程在未来某个时间完成绑定操作。
目前,我能想到的最接近的解决方法是让第一个进程立即绑定到 address/0,并保持绑定直到第二个进程请求它,此时它解除绑定并告诉另一个进程它的端口号获取,然后显式绑定到地址/端口。这有两个问题:1)我宁愿在第二个过程出现之前根本不绑定;2)有一小段时间间隔,在此期间第三方可能会意外(或故意)篡夺端口。
背景
你可能会好奇我为什么要做这么奇怪的事情。我一直在玩弄 ZeroMQ,一个主要的限制是ipc://
Windows 上没有传输。让我感到震惊的是,端口映射器进程(类似于 RPC 端点映射器,或 Erlang 的 epmd)只是使用tcp://
具有动态端口分配的传输实现解决方法的门票。但是,ZeroMQ 客户端和服务器允许无序连接(即,客户端在服务器绑定之前连接不是错误),所以我试图弄清楚连接客户端如何发现 - 非常高度确定性——在服务器实际绑定到该端口之前,将用于通信的端口。