一个简单的C代码文件如下所示:
fd = socket(...)
set_reuseaddr(...)
bind(fd, 6666,...)
此代码可以在一台计算机(Linux)中由两个独立的进程运行。但是,当我在这样的代码中添加listen()
时:
fd = socket(...)
set_reuseaddr(...)
bind(fd, 6666,...)
listen(fd)
第二个进程失败地调用bind()
。
首先,我没有发现两个bind()
仅用于同一端口而不调用listen()
的单独进程的用途。
所以我很困惑,为什么当一个进程试图绑定现有端口时,实现为什么不能仅仅返回失败,为什么它会延迟到listen()
呢?
答案 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()调用。也就是说,对此的用法可能值得专门讨论。