Mar*_*tos 13 windows network-programming zeromq
我想保留一个TCP端口,以便稍后由服务绑定,以便Windows在分配随机端口号时不会无意中使用相同的号码.我知道这可以通过注册表和重新启动,但我想避免这种严厉的解决方案.
一个进程如何在没有实际绑定/监听它的情况下保留一个端口,然后安全地(即避免竞争条件)根据请求将其移交给另一个进程?
端口号无需事先确定.第一个进程可以获取随机端口号,并将其传递给请求进程.
编辑:我觉得我的问题有点不明确.我真正想要的是将动态端口号的分配与bind-to-port-zero操作分开.这意味着不仅要避免意外随机分配该端口号,还要防止任何其他进程在此期间绑定到同一地址/端口.或者,换句话说,我希望一个进程启动bind-to-port-zero操作 - 立即学习将要使用的端口号 - 并让指定的第二个进程在将来的某个时间完成绑定操作.
目前,我能想到的最接近的解决方法是第一个进程立即绑定到地址/ 0,并保持绑定直到第二个进程请求它,此时它取消绑定并告诉另一个进程端口号获取,然后明确绑定到地址/端口.这有两个问题:1)在第二个过程出现之前我根本不会绑定; 2)有一小段时间间隔,第三方可能会意外(或故意)篡夺该端口.
你可能很好奇为什么我想做一些如此奇怪的事情.我一直在玩ZeroMQ,一个主要的限制是ipc://Windows上没有传输.让我感到震惊的是,端口映射器进程(类似于RPC终结点映射器,或Erlang的epmd)只是使用tcp://带有动态端口分配的传输来实现解决方案的票据.但是,允许ZeroMQ客户端和服务器无序连接(即,在服务器绑定之前,客户端连接不是错误),所以我试图弄清楚连接客户端如何发现 - 非常高度确定性 - 在服务器实际绑定到该端口之前将用于通信的端口.
正如@vahapt所提到的,您可以使用修改动态端口范围netsh.
但是,更好的解决方案可能是使用netsh来保留应用程序所需的端口,而不使用默认的动态端口范围.
为此:
使用要保留的端口停止任何进程.如果进程正在使用包含在要保留的端口范围内的端口,则NETSH将返回以下错误,并且预留将失败:
该进程无法访问该文件,因为该文件正由另一个进程使用.
使用以下NETSH命令保留端口:
netsh int <ipv4|ipv6> Add excludedportrange [protocol=]tcp|udp [startport=]<integer> [numberofports=]<integer> [[store=]active|persistent]
例如,要为UDPv6保留端口55368-55372,请使用以下命令:
netsh int ipv6 add excludedportrange protocol=udp startport=55368 numberofports=5
笔记:
有关详细信息,请参阅https://support.microsoft.com/en-us/kb/929851,包括如何查看或删除现有端口保留.
使用netsh命令可能对您有所帮助.您可以更改Windows使用的动态端口范围.
这就像您指出的注册表修改,但它立即生效.
有关netsh命令的详细信息,请参阅:http://support.microsoft.com/kb/929851.
编辑:这仅适用于 Windows Server 2008 之前的版本(Microsoft 支持知识库)
您可以编辑“ReservedPorts”注册表设置
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
要保留一系列端口,请遵循“4000-4010”或“xxxx-yyyy”格式,但要保留单个端口,您必须使用“4000-4000”或“xxxx-xxxx”格式
http://support.microsoft.com/kb/812873
| 归档时间: |
|
| 查看次数: |
29771 次 |
| 最近记录: |