两个进程如何在Windows 7中侦听同一端口?

Ols*_*son 8 sockets windows-7

我在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
Run Code Online (Sandbox Code Playgroud)

第一个要监听的是获取所有传入的请求.

这与我的所有期望完全相反.(我当时希望让EADDRINUSE告诉我港口很忙.)所以....

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

sel*_*bie 7

如果使用标志SO_REUSEADDR打开套接字,则可以实现这一点,这对于TCP套接字应用程序来说并不罕见.

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

  1. 当一个进程崩溃,被杀或被强行重启而没有机会关闭其套接字时.或者进程退出但套接字(或子连接套接字)仍处于FIN_WAIT或FIN_WAIT2状态.第二个进程可以在不获取"已使用"错误代码的情况下打开套接字.我已经阅读了几篇关于SO的帖子,建议这是TCP套接字的最佳实践.

  2. 同一服务器程序可以同时分叉或运行多次.这允许在没有编写服务器程序的情况下进行负载平衡以利用线程.通常,监听套接字的程序的"其他实例"将接受传入连接,而第一个连接正忙于另一个连接.

关于第二个问题,最简单的方法是不使用SO_REUSEADDR.如果您担心可能存在尝试使用SO_REUSADDR的流氓应用,那么您的应用可以使用SO_EXCLUSIVEADDRUSE.(一个标志,基本上说,"不允许其他应用程序使用SO_REUSEADDR打开同一个端口.)