1. 程式人生 > >伺服器中判斷客戶端socket斷開連線的方法

伺服器中判斷客戶端socket斷開連線的方法

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交給了系統處理。





 


 


    這個訊號的預設處理方法是退出程序,大多數時候這都不是我們期望的。因此我們需要過載這個訊號的處理方法。呼叫以  下程式碼,即可安全的遮蔽SIGPIPE: