gpt4 book ai didi

sockets - 在 Windows 7 中,两个进程如何监听同一端口?

转载 作者:行者123 更新时间:2023-12-02 10:38:15 26 4
gpt4 key购买 nike

我在 Windows 7 中运行两个 stunnel 实例,配置为监听同一端口,并且它们似乎都成功监听同一端口(仅使用 socket()/bind()/listen()) 。两个实例的所有调用似乎都成功,并且它们显示在 netstat 中:

C:\>netstat -ano | grep 8000
TCP 0.0.0.0:8000 0.0.0.0:0 LISTENING 5828
TCP 0.0.0.0:8000 0.0.0.0:0 LISTENING 5852

第一个监听的人会获取所有传入的请求。

这与我的预期完全相反。 (我期待 EADDRINUSE 告诉我端口正忙。)所以......

  1. 为什么/如何运作?这种行为在某些情况下有用吗?
  2. 如果另一个应用程序要捕获传入请求,我不希望实例成功运行...如何使端口独占?

最佳答案

如果使用标志 SO_REUSEADDR 打开套接字,则可以完成此操作,这对于 TCP 套接字应用程序来说并不罕见。

通常,SO_REUSEADDR 用于以下两种情况之一:

  1. 当进程崩溃、被终止或在没有机会关闭其套接字的情况下强行重新启动时。或者进程退出但套接字(或子连接套接字)仍处于FIN_WAIT或FIN_WAIT2状态。第二个进程可以打开套接字,而不会收到“已在使用”错误代码。我读过几篇关于 S.O. 的文章。表明这是 TCP 套接字的最佳实践。

  2. 同一个服务器程序要么 fork ,要么同时运行多次。这允许负载平衡,而无需编写使用线程的服务器程序。通常,监听套接字的程序的“其他实例”将接受传入连接,而第一个实例正忙于另一个连接。

关于你的第二个问题,最简单的办法就是不使用SO_REUSEADDR。如果您担心可能有恶意应用程序尝试使用 SO_REUSADDR,那么您的应用程序可以使用 SO_EXCLUSIVEADDRUSE。 (一个标志,基本上是说,“不允许其他应用程序使用 SO_REUSEADDR 打开同一端口。)

关于sockets - 在 Windows 7 中,两个进程如何监听同一端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12352935/

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