作業系統如何判斷「地址已在使用中」?

作業系統如何判斷「地址已在使用中」?

如果我的 C 程式使用套接字、綁定到localhost:9025、交換一些資料、手動終止並重新啟動,它有時會崩潰,錯誤如下:

地址已使用。

我嘗試查找“使用 port 的 pid”的所有 SE 推薦軟體都未能返回任何進程 ID,因此我假設當時沒有進程使用 port 9025,情況應該如此。

儘管如此,從我從對主題相似的問題的評論中收集到的信息來看,在我看來,當且僅當一個進程使用該特定地址時,“地址”才是“已在使用”。那為什麼這是假的呢?

現在我假設作業系統追蹤哪些位址正在使用,哪些沒有,但情況確實如此嗎?如果是這樣,我會很高興您能告訴我如何糾正它,因為我解決這個問題的最佳解決方案是「等待不確定的時間」。

編輯:我使用Linux 5.2.2-arch1-1-ARCH x86_64

答案1

您可能重新啟動程式的速度太快,或者程式沒有關閉套接字。

即使在套接字關閉後,Linux 也會使連線處於不穩定狀態一段時間,但會阻止任何其他連線接受同一個四元組「來源位址、來源連接埠、目標位址、目標連接埠」。

解決方案是在程式中設定套接字選項 套索克選擇 像這樣:

setsockopt(socket,SOL_SOCKET,SO_REUSEADDR ... )

相關內容