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

Nai*_*Jay 2 sockets linux

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

fd = socket(...)
set_reuseaddr(...)
bind(fd, 6666,...)
Run Code Online (Sandbox Code Playgroud)

该代码可以由一台机器(Linux)中的两个单独的进程运行。但是当我添加listen()这样的代码时:

fd = socket(...)
set_reuseaddr(...)
bind(fd, 6666,...)
listen(fd)
Run Code Online (Sandbox Code Playgroud)

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

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

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

use*_*260 5

此行为在手册页中得到解决,引用:

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

因此,从引用中可以清楚地看出,除非有一个活动的侦听套接字已绑定到该地址,否则绑定将起作用。

\n\n

另外,您可能可以考虑使用SO_REUSEPORT在工作进程之间重新分配Accept()调用。也就是说,其用途可能值得专门讨论。

\n