linux - 为什么我不是从bind()而是从listen()得到EADDRINUSE?

标签 linux sockets network-programming bind listen

在 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/

相关文章:

networking - TCP 从已用于监听的端口打开套接字

linux - 在 Linux 上安装 qt

将 32 位转换为浮点值

sockets - 如何读取在 Golang 中接收到的 UDP 数据报的输入接口(interface)和远程套接字地址?

c套接字: recv and send data simultaneously

linux - "zero copy networking"与 "kernel bypass"?

c - 如何通过从 ini 文件中提取值来更新指针的值?

c++ - 如何将 lambda 函数或 std::function 与采用函数指针的 API 结合使用?

c - curl 套接字挂起

java.net.SocketException : Network is unreachable: connect Response data in JMeter