在一個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