1. 程式人生 > >伺服器關了已經連線的客戶端socket…

伺服器關了已經連線的客戶端socket…

 服務端關閉已連線客戶端,客戶端接著發資料產生問題,    1. 當伺服器close一個連線時,若client端接著發資料。根據TCP協議的規定,會收到一個RST響應,client再往這個伺服器傳送資料時,系統會發出一個SIGPIPE訊號給程序,告訴程序這個連線已經斷開了,不要再寫了。     根據訊號的預設處理規則SIGPIPE訊號的預設執行動作是terminate(終止、退出),所以client會退出。若不想客戶端退出可以把SIGPIPE設為SIG_IGN     如:    signal(SIGPIPE,SIG_IGN); 這時SIGPIPE交給了系統處理。    2. 客戶端write一個已經被伺服器端關閉的sock後,返回的錯誤資訊Broken pipe.      1)broken pipe的字面意思是“管道破裂”。broken pipe的原因是該管道的讀端被關閉。      2)broken pipe經常發生socket關閉之後(或者其他的描述符關閉之後)的write操作中    3)發生broken pipe錯誤時,程序收到SIGPIPE訊號,預設動作是程序終止。      4)broken pipe最直接的意思是:寫入端出現的時候,另一端卻休息或退出了,        因此造成沒有及時取走管道中的資料,從而系統異常退出;   伺服器採用了fork的話,要收集垃圾程序,防止殭屍程序的產生,可以這樣處理:           signal(SIGCHLD,SIG_IGN); 交給系統init去回收。    這裡子程序就不會產生殭屍程序了。