首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同一端口上的多个TCP服务器

同一端口上的多个TCP服务器
EN

Stack Overflow用户
提问于 2012-11-26 14:55:59
回答 1查看 2K关注 0票数 6

对我来说很奇怪。我可以在同一个端口上运行多个TCP服务器。

我使用Apache MINA库并编写了以下代码:

代码语言:javascript
复制
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.bind(new InetSocketAddress(80));

端口80已经被另一个程序使用了。但我没有得到例外“地址已经在使用”。使用netstat,我可以看到以下内容:

代码语言:javascript
复制
C:\>netstat -oan |find /i "LIST"
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       2220
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       904
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       840

有人能解释一下我的这种行为吗?

操作系统: Windows 7。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-02-02 01:23:52

通常只有一个进程可以监听TCP端口、Windows或任何其他操作系统(至少是主要的进程)。在Windows上,如果两个进程共享端口,您可能会得到错误代码10048。如果进程绑定到不同的接口地址(即使一个绑定到INADDR_ANY,另一个绑定到特定的地址,它们也不会发生冲突),这就不适用了。此外,如果在第二个套接字上设置了SO_REUSEADDR,则这不适用。

由于这两个进程都绑定到INADDR_ANY,并且您声称您的进程没有设置SO_REUSEADDR,因此这是一个谜。据我所知,有三种可能性:

  1. 默认情况下,底层库中的某些内容正在设置SO_REUSEADDR
  2. 第二个套接字实际上是后来打开的,它是指定SO_REUSEADDR的那个。
  3. Windows套接字层中有一个允许这样做的错误。

我意识到没有任何软件是完美的,但我真的很犹豫选择第三种选择,特别是如果你可以很容易地复制它。我建议在启动进程之前和之后仔细观察netstat输出,并查看在此之前是否存在其他侦听器。另外,尝试识别其他进程并查看它是否相关(您可以启用任务管理器中的PID列)。

编辑

下面的评论提醒我,我应该指出,SO_REUSEADDR的行为在不同的平台上确实不同。Windows允许使用该选项的新套接字强制绑定到与其他侦听套接字相同的端口,如果两个套接字都是TCP,则不确定行为,正如讨论的这里。实际上,第二个套接字可能“窃取”了地址,但官方的行文似乎是这种行为没有定义:

一旦第二个套接字成功绑定,绑定到该端口的所有套接字的行为都是不确定的。例如,如果同一端口上的所有套接字都提供TCP服务,则无法保证任何通过端口传入的TCP连接请求都由正确的套接字处理--该行为是不确定的。

如果旧的TCP套接字仍在监听,Linux (和其他Unix变体)将不允许两个TCP套接字共享同一个端口。在这种情况下,SO_REUSEADDR只允许新套接字绑定,如果旧套接字在TIME_WAIT中(也许FIN_WAIT和CLOSE_WAIT状态,我必须检查)。

顺便提一下,当我第一次在Windows中看到它时,我发现它的行为上的差异非常令人惊讶,但是我已经亲自测试了它,当然如果在两个套接字上设置SO_REUSEADDR,很可能同时成功地绑定到完全相同的地址和端口。然而,我还没有对这种情况下的确切行为做过广泛的测试,因为在我的情况下,这并没有多大关系。

我不打算进入哪个平台是“正确的”,但当然,Windows行为已经导致安全问题,这就是为什么他们提出了SO_EXCLUSIVEADDRUSE选项,以防止其他套接字强制绑定。我似乎也认为Windows版本应该被看作是一种完全不同的选择,有着不同的行为,只是碰巧有着相同的名字。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13567361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档