为什么两个单独的进程可以将bind()绑定到同一个TCP端口,但不能同时侦听?

时间:2018-09-04 13:24:15

标签: linux sockets

一个简单的C代码文件如下所示:

fd = socket(...)
set_reuseaddr(...)
bind(fd, 6666,...)

此代码可以在一台计算机(Linux)中由两个独立的进程运行。但是,当我在这样的代码中添加listen()时:

fd = socket(...)
set_reuseaddr(...)
bind(fd, 6666,...)
listen(fd)

第二个进程失败地调用bind()

首先,我没有发现两个bind()仅用于同一端口而不调用listen()的单独进程的用途。

所以我很困惑,为什么当一个进程试图绑定现有端口时,实现为什么不能仅仅返回失败,为什么它会延迟到listen()呢?

1 个答案:

答案 0 :(得分:2)

此问题已在手册页中解决,引用:

   SO_REUSEADDR
          Indicates that the rules used in validating addresses supplied
          in a bind(2) call should allow reuse of local addresses.  For
          AF_INET sockets this means that a socket may bind, except when
          there is an active listening socket bound to the address.
          When the listening socket is bound to INADDR_ANY with a spe‐
          cific port then it is not possible to bind to this port for
          any local address.  Argument is an integer boolean flag.

因此,从引号中可以很明显地看出,除非已经有一个有效的 listening 套接字已绑定到该地址,否则绑定将起作用。

此外,您可能考虑使用 SO_REUSEPORT 在工作进程之间重新分配 accept()调用。也就是说,对此的用法可能值得专门讨论。