我們有一個程式可以監聽連接埠以接收有關運行報告的資訊。關閉並重新開啟程式後,我們收到一條錯誤訊息,指出它使用的連接埠已在使用中。查看netstat
,我們看到該連接埠有 9 個實例處於 CLOSE_WAIT 狀態,1 個實例處於偵聽狀態。處於偵聽狀態的實例表示它的擁有者是 pid 488 taskkill
。該應用程式是一個內部 .NET 應用程式。
這是生產環境,因此我們希望避免重新啟動機器。什麼可能導致此問題以及可以採取哪些措施來解決該問題?
答案1
CLOSE_WAIT 表示套接字已收到另一端的 FIN 封包,正在等待擁有該偵聽套接字的應用程式關閉。不在監聽套接字上呼叫 close() 可能會導致它浮動,就像它為您所做的那樣。
由於它是一個內部 .NET 應用程序,我會仔細檢查您的原始程式碼,以確保在退出之前正確關閉套接字。
有關套接字狀態的更多信息,包括 CLOSE_WAIT: http://blogs.technet.com/b/janelewis/archive/2010/03/09/explaining-close-wait.aspx