第十四篇:回射程式中的異常分析

穆晨發表於2017-05-19

前言

      在之前的文章中,我對回射程式做了分析,但那一次的分析是基於正常執行的。本文將說明在各種異常情況下該程式的執行情況。

異常一 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。

相關文章