一个简单的 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()?
此行为在手册页中得到解决,引用:
\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.\nRun Code Online (Sandbox Code Playgroud)\n\n因此,从引用中可以清楚地看出,除非有一个活动的侦听套接字已绑定到该地址,否则绑定将起作用。
\n\n另外,您可能可以考虑使用SO_REUSEPORT在工作进程之间重新分配Accept()调用。也就是说,其用途可能值得专门讨论。
\n