伺服器中判斷客戶端socket斷開連線的方法
阿新 • • 發佈:2018-11-12
1, 如果服務端的Socket比客戶端的Socket先關閉,會導致客戶端出現TIME_WAIT狀態,佔用系統資源。
所以,必須等客戶端先關閉Socket後,伺服器端再關閉Socket才能避免TIME_WAIT狀態的出現。
2, 在linux下寫socket的程式的時候,如果嘗試send到一個disconnected socket上,就會讓底層丟擲一個SIGPIPE訊號。
client端通過 pipe 傳送資訊到server端後,就關閉client端, 這時server端,返回資訊給 client 端時就產生Broken pipe 訊號了。
當伺服器close一個連線時,若client端接著發資料。根據TCP協議的規定,會收到一個RST響應,client再往這個伺服器傳送資料時,系統會發出一個SIGPIPE訊號給程序,告訴程序這個連線已經斷開了,不要再寫了。
根據訊號的預設處理規則SIGPIPE訊號的預設執行動作是terminate(終止、退出),所以client會退出。若不想客戶端退出可以把SIGPIPE設為SIG_IGN
如: signal(SIGPIPE,SIG_IGN);
這個訊號的預設處理方法是退出程序,大多數時候這都不是我們期望的。因此我們需要過載這個訊號的處理方法。呼叫以 下程式碼,即可安全的遮蔽SIGPIPE:
所以,必須等客戶端先關閉Socket後,伺服器端再關閉Socket才能避免TIME_WAIT狀態的出現。
2, 在linux下寫socket的程式的時候,如果嘗試send到一個disconnected socket上,就會讓底層丟擲一個SIGPIPE訊號。
client端通過 pipe 傳送資訊到server端後,就關閉client端, 這時server端,返回資訊給 client 端時就產生Broken pipe 訊號了。
當伺服器close一個連線時,若client端接著發資料。根據TCP協議的規定,會收到一個RST響應,client再往這個伺服器傳送資料時,系統會發出一個SIGPIPE訊號給程序,告訴程序這個連線已經斷開了,不要再寫了。
根據訊號的預設處理規則SIGPIPE訊號的預設執行動作是terminate(終止、退出),所以client會退出。若不想客戶端退出可以把SIGPIPE設為SIG_IGN
如: signal(SIGPIPE,SIG_IGN);
這時SIGPIPE交給了系統處理。
這個訊號的預設處理方法是退出程序,大多數時候這都不是我們期望的。因此我們需要過載這個訊號的處理方法。呼叫以 下程式碼,即可安全的遮蔽SIGPIPE: