2017-03-28 14 views
2

我在我的Linux(4.10.3)系統上使用簡單的基於C的服務器 程序時發現了一些奇怪的事情。我不小心結束了呼叫 listen()兩次在一個套接字上(從服務器進程)我有 在更早的時候調用bind()。我注意到這兩個聽調用 成功沒有任何錯誤。實際上,多少個 調用來監聽我所做的並不重要,所有的調用都是成功的。不止一次地在套接字上調用 - 期望的行爲?

我期待所有的電話在第一個電話後收聽 與EADDRINUSE。我錯過了什麼嗎? Linux/POSIX手冊頁不需要 似乎對此有任何說明。我沒有找到有關 以下網頁上的這種行爲一個參考:)

https://www.mkssoftware.com/docs/man3/listen.3.asp

的應用程序可以調用聽(超過一次在同一插座上更多。 這具有更新當前積壓的效果,用於監聽 套接字。如果有更多未決連接數比新積壓的值多,則多餘的未決連接將重置並丟棄。

目前還不清楚這是否也適用於Linux。所以我的問題是: 當在同一個套接字上調用多次從同一個進程調用 時會發生什麼? (顯然在用戶空間中沒有明顯的副作用,但是Linux內核在內核空間中做了些什麼特別的事情?)

謝謝。

+0

當我閱讀時,[listen]的POSIX規範(http://pubs.opengroup.org/onlinepubs/9699919799/functions/listen.html)沒有規定這種情況的行爲,這意味着可移植的代碼應該避免這樣做。 – zwol

+0

我不希望EADDRINUSE。這會發生在前面的bind()步驟。也許是EINVAL。 – EJP

+0

@zwol:你說的對,便攜式程序應該避免這樣做。我只是對Linux內核做什麼感到好奇。 – userRG

回答

2

Linux內核使用新積壓值調整積壓隊列長度,但僅限於將來的連接請求。它不會丟棄已經在隊列中的任何掛起的連接。

listen()的第二次和後續調用沒有其他影響,除非套接字類型錯誤(不是SOCK_STREAM),或者處於錯誤狀態(已連接到特定對等設備,或者已經在被關閉的過程)。

+0

謝謝@Gil,這似乎是最可能的解釋。我試圖通過內核來追蹤這一點。 – userRG

相關問題