在一个C++ Linux应用程序中,我调用socket(),bind()和listen()来创建服务器套接字。通常,如果应用程序启动两次(使用相同的服务器端口),则在第二个进程中,bind()将失败并显示EADDRINUSE错误。然而,现在我有一个情况下bind()显然已成功,但随后的listen()调用已抛出EADDRINUSE错误...为什么我会从bind()而不是从listen()获得EADDRINUSE?
这可能是一种罕见的竞争条件,但我仍然对可能会发生第二个bind()成功但第二个listen()不成功的情况。有没有人知道更多关于这种情况?
这是在32位RHEL 5.3上。
谢谢,这似乎是解释。显然这些规则是: listen()实际上会保留内核中的端口,并且如果另一个进程在端口上调用了listen(),将引发EADDRINUSE; bind()并不保留端口,但如果另一个进程在端口上调用了listen(),则会引发EADDRINUSE – oliver