gpt4 book ai didi

windows - 在 Windows 中保留一个 TCP 端口

转载 作者:可可西里 更新时间:2023-11-01 12:31:24 32 4
gpt4 key购买 nike

我想保留一个 TCP 端口,稍后由服务绑定(bind),这样 Windows 在分配随机端口号时不会无意中使用相同的号码。我知道这可以通过注册表和重新启动来实现,但我想避免这种粗暴的解决方案。

一个进程如何在不实际绑定(bind)/监听它的情况下保留一个端口,然后安全地(即避免竞争条件)根据请求将其交给另一个进程?

不需要预先确定端口号。第一个进程获取一个随机端口号并传递给请求进程就可以了。

编辑: 我突然想到我的问题表述得有些糟糕。我真正想要的是将动态端口号的分配与绑定(bind)到端口零操作分开。这意味着不仅要避免意外随机分配该端口号,还要防止任何其他进程在此期间绑定(bind)到同一地址/端口。或者,换句话说,我希望一个进程启动绑定(bind)到端口零的操作——立即了解将使用的端口号——并让指定的第二个进程在将来的某个时间完成绑定(bind)操作。

目前,我能想到的最接近的解决方法是让第一个进程立即绑定(bind)到地址/0,并保持绑定(bind)状态直到第二个进程请求它,此时它解除绑定(bind)并告诉另一个进程它获取的端口号,然后显式绑定(bind)到地址/端口。这有两个问题:1)我宁愿在第二个过程出现之前根本不绑定(bind); 2) 有一小段时间间隔,第三方可能会无意(或故意)篡夺端口。

背景

你可能很好奇为什么我想做这么奇怪的事情。我一直在玩弄 ZeroMQ,一个主要限制是 Windows 上缺少 ipc:// 传输。令我震惊的是,端口映射器进程(类似于 RPC 端点映射器或 Erlang 的 epmd)将只是使用带有动态端口分配的 tcp:// 传输实现变通方法的门票。但是,允许 ZeroMQ 客户端和服务器乱序连接(即,客户端在服务器绑定(bind)之前连接不是错误),所以我试图弄清楚连接的客户端如何发现 - 用一个非常高度确定性——在服务器实际绑定(bind)到该端口之前将用于通信的端口。

最佳答案

如@vahapt 所述,您可以使用 netsh 修改动态端口范围.

但是,更好的解决方案可能是使用 netsh 保留应用程序所需的端口,而保留动态端口的默认范围。

这样做:

  1. 在 Server 2008/2008 R2 上,安装 Microsoft hotfix . Server 2012 或更高版本不需要这样做。
  2. 停止使用要保留的端口的任何进程。如果进程正在使用包含在要保留的端口范围内的端口,NETSH 将返回以下错误并且保留将失败:

    The process cannot access the file because it is being used by another process.

  3. 使用以下 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

注意事项:

  • 默认情况下,端口保留在重新启动后保持不变
  • 可以为协议(protocol)的第 4 版或第 6 版保留端口,但不能同时为两者保留端口(即,您不能为 TCPv4 和 TCPv6 保留端口 60000)

参见 https://support.microsoft.com/en-us/kb/929851获取更多信息,包括如何查看或删除现有端口保留。

关于windows - 在 Windows 中保留一个 TCP 端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5254330/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com