在C ++ Linux应用程序中,我调用socket(),bind()和listen()来创建服务器套接字。通常,如果应用程序启动两次(使用相同的服务器端口),则在第二个进程中,bind()将因EADDRINUSE错误而失败。但是,现在我遇到了bind()显然已成功但后续listen()调用抛出EADDRINUSE错误的情况...
这可能是一种罕见的竞争条件,但我仍然对第二次bind()成功但第二次listen()没有成功的情况感兴趣。有没有人更了解这种情况?
这是在32位RHEL 5.3上。
答案 0 :(得分:3)
不确定Linux,但在Windows上,如果在调用INADDR_ANY
时指定了通配符IP(bind()
等),则基础绑定可能会延迟到listen()
或{{调用1}},因为操作系统有更好的机会在那时决定最好使用哪个网络接口。 connect()
在这种情况下不会报告错误。
答案 1 :(得分:1)
setsockopt(.... SOL_SOCKET, SO_REUSEADDR, ...)
应该可以解决您的问题。
(至于为什么第二个bind
实际上成功了,不知道......实际上这应该已经失败了)