簡體   English   中英

如何檢測Linux上的C端口是否已在使用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM