为什么我不能从bind()而是从listen()获得EADDRINUSE?

时间:2011-07-15 13:52:45

标签: linux sockets network-programming bind listen

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

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

这是在32位RHEL 5.3上。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

setsockopt(.... SOL_SOCKET, SO_REUSEADDR, ...)应该可以解决您的问题。

请参阅setsockopt(2)socket(7)

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