前言
在之前的文章中,我對回射程式做了分析,但那一次的分析是基於正常執行的。本文將說明在各種異常情況下該程式的執行情況。
異常一 accept返回前連線終止
描述:客戶端在3次握手剛好完成的時候,發出RST。參見下圖:
影響:伺服器端的accept函式將會返回-1,同時errno的值被置為ECONNABORTED。
異常二 伺服器子程式終止
描述:伺服器子程式被終止( 如kill命令 )
過程分析( 伺服器子程式被終止後 ):
1. 伺服器向客戶傳送FIN 客戶迴應ACK
2. SIGCHLD訊號被髮送給伺服器並得到正確處理
3. 此時,客戶並沒有發生任何特殊的事情!!它若無其事的阻塞在Fgets函式上。
4. 當客戶此時向終端輸入字元並回車,因為伺服器已經終止了對這位客戶的服務,因此會“無情”地返回一個RST。
5. 客戶此後呼叫Readline函式,但它Read到了1中的那個FIN,於是異常終止。
應對方法:客戶應該同時阻塞於分節和IO輸入,需要用到IO複用技術。此乃後話。
異常三 SIGPIPE 訊號
描述:客戶向已經對其傳送RST訊號的伺服器寫入
影響:核心將會向程式傳送SIGPIPE訊號,此訊號預設處理時關閉此程式。
異常四 伺服器崩潰( 在客戶端主動連線之前 )
描述:伺服器突然斷網了或者斷電了
影響:如此第一次SYN分節都不會被送達給伺服器,故Readline將等待一定時間後返回錯誤,errno被置為EHOSTUNREACH或者ENETUNREACH。