CS模型之服務器進程終止

現在我們啓動我們的客戶/服務器,然後殺死服務器子進程。這是在模擬服務器進程崩潰的情況,我們可從中查看客戶將發生什麼。
(1)啓動服務器和客戶端,正常回射。
這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述
(2)找到服務器子進程ID,並kill殺死它。子進程中所有打開的描述符都被關閉。這導致向客戶發送FIN,而客戶TCP則相應ACK。這就是TCP連接終止工作的前半部分。
(3)SUGCHLD信號被髮送給服務器父進程,並得到正確處理。
(4)客戶上並沒有發生任何特殊之事。客戶TCP接收服務器TCP的FIN並相應一個ACK,然而問題是客戶進程阻塞在fgets調用上。
這裏寫圖片描述

(5)我們再鍵入一行,str_cli調用writen,客戶TCP接着把數據發給服務器,TCP允許這麼做,因爲客戶收到FIN只是表示服務器進程已關閉了連接的服務器端,從而不再往其中發送任何數據而已。
(6)當服務器端接收到TCP客戶數據時,相應RST。
(7)然而客戶進程看不到RST,因爲它在調用writen後立即調用readline,並且收到(2)的FIN,readline返回0。
(8)客戶端關閉時,所有打開的描述符關閉
這裏寫圖片描述

這裏寫圖片描述

問題

當FIN到達套接字時,客戶正阻塞在fgets調用上,客戶實際在應對兩個描述符,套接字和用戶輸入,它不能單純阻塞在這兩個源中的某個特定源上。接下來講解select和poll可以解決這個問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章