我在我的Linux(4.10.3)系統上使用簡單的基於C的服務器 程序時發現了一些奇怪的事情。我不小心結束了呼叫 listen()
兩次在一個套接字上(從服務器進程)我有 在更早的時候調用bind()
。我注意到這兩個聽調用 成功沒有任何錯誤。實際上,多少個 調用來監聽我所做的並不重要,所有的調用都是成功的。不止一次地在套接字上調用 - 期望的行爲?
我期待所有的電話在第一個電話後收聽 與EADDRINUSE
。我錯過了什麼嗎? Linux/POSIX手冊頁不需要 似乎對此有任何說明。我沒有找到有關 以下網頁上的這種行爲一個參考:)
https://www.mkssoftware.com/docs/man3/listen.3.asp
的應用程序可以調用聽(超過一次在同一插座上更多。 這具有更新當前積壓的效果,用於監聽 套接字。如果有更多未決連接數比新積壓的值多,則多餘的未決連接將重置並丟棄。
目前還不清楚這是否也適用於Linux。所以我的問題是: 當在同一個套接字上調用多次從同一個進程調用 時會發生什麼? (顯然在用戶空間中沒有明顯的副作用,但是Linux內核在內核空間中做了些什麼特別的事情?)
謝謝。
當我閱讀時,[listen]的POSIX規範(http://pubs.opengroup.org/onlinepubs/9699919799/functions/listen.html)沒有規定這種情況的行爲,這意味着可移植的代碼應該避免這樣做。 – zwol
我不希望EADDRINUSE。這會發生在前面的bind()步驟。也許是EINVAL。 – EJP
@zwol:你說的對,便攜式程序應該避免這樣做。我只是對Linux內核做什麼感到好奇。 – userRG