我在 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 告诉我端口正忙。)所以......
- 为什么/这是如何工作的?这种行为在某些情况下有用吗?
- 如果另一个应用程序要捕获传入请求,我不希望实例成功运行...如何使端口独占?
如果使用标志打开套接字,则可以完成此操作SO_REUSEADDR http://msdn.microsoft.com/en-us/library/windows/desktop/ms740621%28v=vs.85%29.aspx,这对于 TCP 套接字应用程序来说并不罕见。
通常,SO_REUSEADDR 用于以下两件事之一:
当进程崩溃、被终止或强制重新启动而没有机会关闭其套接字时。或者进程退出但套接字(或子连接套接字)仍处于FIN_WAIT或FIN_WAIT2状态。第二个进程可以打开套接字,而不会收到“已在使用”错误代码。我读过几篇关于 S.O. 的文章。表明这是 TCP 套接字的最佳实践。
同一服务器程序要么分叉,要么同时运行多次。这允许负载平衡,而无需编写使用线程的服务器程序。通常,侦听套接字的程序的“其他实例”将接受传入连接,而第一个实例正忙于另一个连接。
关于你的第二个问题,最简单的方法就是不使用SO_REUSEADDR。如果您担心可能有恶意应用程序尝试使用 SO_REUSADDR,那么您的应用程序可以使用 SO_EXCLUSIVEADDRUSE。 (一个标志,基本上是说,“不允许其他应用程序使用 SO_REUSEADDR 打开同一个端口。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)