[英]On linux, when performing a socket bind with port 0 (pick a random port) using C, I get errno 98, Address already in use. How is that possible?
[英]How to detect if a port is already in use in C on Linux?
我正在寫一個簡單的Web服務器。 我想讓用戶設置服務器監聽的端口,但我怎么知道用戶輸入的端口是否已被使用?(如果我知道它已經在使用中,我可以告訴他們輸入另一個一。)
只需嘗試bind
到端口,如果失敗,請檢查errno
EADDRINUSE
。 這是唯一的方法,因為要正確,任何此類檢查必須是原子的。 如果你做了一個單獨的檢查,然后在發現它沒有被使用后嘗試綁定到端口,另一個進程可能在中間時間綁定到端口,再次導致它失敗。 同樣,如果您進行了單獨的檢查並發現端口已在使用中,則使用它的進程可能會在中間時間關閉端口,退出或崩潰,從而導致結果不正確。
所有這一切(我寫一個長答案而不是一個簡短答案的原因)是檢查“我可以這樣做嗎?”的正確,有力的方法。 幾乎總是嘗試這樣做並檢查失敗。 任何其他方法都可能導致競爭條件,並且在許多情況下競爭條件(盡管可能不是你的競爭條件)競爭條件是安全漏洞。
bind()
將失敗:
成功時,返回零。 出錯時,返回-1,並正確設置errno。
EADDRINUSE給定的地址已被使用。
另一種方法:嘗試連接到localhost
上的該端口。
如果bind()顯示一些錯誤
只需創建一個套接字並調用bind()。 如果bind()成功,則繼續執行listen(),否則應執行一些錯誤處理過程,例如切換到默認端口,打印錯誤消息並等待用戶交互,或者至少登錄並退出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.