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



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

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

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

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

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

首先,我没有找到两个单独的进程的用途,它们仅bind()到同一端口而不调用listen()

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

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

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.

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

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

最新更新