在 C++ Linux 应用程序中,我调用socket()、bind() 和listen() 来创建服务器套接字。通常,如果应用程序启动两次(使用相同的服务器端口),在第二个进程中,bind() 将失败并出现 EADDRINUSE 错误。但是,现在我遇到这样的情况:bind() 显然已成功,但后续的listen() 调用引发了 EADDRINUSE 错误...
这可能是一种罕见的竞争条件,但我仍然对第二个bind()成功但第二个listen()不成功的情况感兴趣。有谁知道更多关于这样的案例吗?
这是在 32 位 RHEL 5.3 上。
最佳答案
不确定 Linux 上的情况,但在 Windows 上,如果在调用 bind()
时指定了通配符 IP(INADDR_ANY
等),则底层绑定(bind)可能会延迟,直到调用 listen()
或 connect()
,因为操作系统当时有更好的机会决定最好使用哪个网络接口(interface)。 bind()
在这种情况下不会报告错误。
关于linux - 为什么我不是从bind()而是从listen()得到EADDRINUSE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6708017/