2

在 C++ Linux 应用程序中,我调用 socket()、bind() 和 listen() 来创建服务器套接字。通常如果应用程序启动两次(使用相同的服务器端口),在第二个进程中 bind() 将失败并出现 EADDRINUSE 错误。但是,现在我遇到了一个 bind() 显然成功但随后的 listen() 调用引发了 EADDRINUSE 错误的情况......

这可能是一种罕见的竞争条件,但我仍然对第二个 bind() 成功但第二个 listen() 没有成功的情况感兴趣。有没有人更了解这种情况?

这是在 32 位 RHEL 5.3 上。

4

2 回答 2

3

不确定Linux,但在Windows上,如果INADDR_ANY在调用时指定了通配符IP(等)bind(),底层绑定可能会延迟到listen()或被connect()调用,因为操作系统有更好的机会在那个时候决定哪个网络接口是最好的使用。bind()在那种情况下不会报错。

于 2011-07-16T00:47:40.883 回答
1

setsockopt(.... SOL_SOCKET, SO_REUSEADDR, ...)应该解决你的问题。

参见setsockopt(2)socket(7)

(至于为什么第二个bind实际上成功了,不知道......实际上这也应该已经失败了)

于 2011-07-15T13:57:21.453 回答