網路程式設計的異常及處理

2022-05-22 09:42:10 字數 2289 閱讀 7091

網路程式設計不只是編寫網路、主機、程序都正常時能良好工作的程序,更重要的是客戶主機崩潰、客戶程序崩潰網路異常時怎麼處理。

accept被訊號中斷

accept以及套接字上的i/o可能被訊號打斷,並返回eintr作為結果,必須處理該返回值並且適當時候再次呼叫。

for(;;)

else}}

connect被訊號中斷

connect被訊號打斷,返回eintr作為結果,不能對該socket再次呼叫connect,需要使用select等待連線完成。

accept返回前連線夭折

estiblished狀態的連線在被accept取走之前夭折,對於這種錯誤,不同的系統有不同的處理,大多數是返回乙個錯誤結果給程序,svr4返回eproto(協議錯誤),posix指出必須返回econnaborted(軟體引起的連線錯誤),在返回econnaborted錯誤時,重新呼叫accept即可。

也有的作業系統會直接清除掉這種夭折的連線,伺服器程序根本不會發現夭折的連線。

echo迴響程式處理伺服器端異常終止

客戶端程序阻塞於終端輸入時,服務端程序異常終止,三次握手終止連線,客戶端把fin追加到clifd的讀取緩衝區末尾。

客戶從終端輸入字元,通過clifd傳送給服務端(由於服務端已關閉,會回覆乙個rst給客戶端)並呼叫read獲取結果。

此時fin已在讀取緩衝區,而rst還在網路傳輸的過程中,因此read返回0,代表對端已關閉,而不是讀取到rst的復位訊息。

為了避免這種場景的rst訊息,客戶端需要使用多路復用同時監聽多個輸入:套介面和終端輸入。這樣就能早先一步獲取fin訊息,避免連線終止後還向對端傳送訊息。

sigpipe

程序向乙個接收到rst的套接字寫入訊息時,核心會給程序傳送乙個sigpipe訊號。

完整的過程是:程序向乙個接收到fin的套接字寫入訊息,接收到rst應答,此時再次寫入,核心會給程序傳送乙個sigpipe訊號。

此訊號的預設動作是終止程序,不產生core檔案。

不管程序是否捕捉該訊號,寫操作都會返回epipe錯誤。

sigpipe的處理

sigpipe預設是終止程序,並且不產生core檔案,這就無從跟蹤和發現問題。

對sigpipe的處理可以是:

1.設定sig_ign,無視該訊號,並預設write會處理epipe錯誤。

2.訊號處理函式中處理該錯誤,需要知道的是,訊號處理函式無法判斷是哪個套接字出了錯誤,如果確實要知道哪個套接字出了錯誤,還是需要在write返回後處理epipe錯誤。

伺服器主機崩潰

當客戶端和伺服器之間建立連線後,伺服器主機崩潰,此時通過網路發往伺服器主機的訊息不會得到任何回應。

此時可能返回的錯誤有兩種

1.客戶端持續重傳資料分節,一直沒有得到回應,此時應返回etimeout錯誤。

2.如果中間路由器判斷伺服器主機不可達,並返回乙個icmp錯誤,則錯誤是ehostunreach或enetunreach。

通過write的返回值,可以得知錯誤原因,但是通常需要等待很長一段時間。

快速檢測伺服器主機崩潰

給套接字加上乙個超時時間

在不主動傳送訊息的時候檢測伺服器主機崩潰

心跳訊息

伺服器主機崩潰後重啟

如果伺服器主機崩潰後並重啟,在崩潰期間客戶沒有傳送訊息給伺服器,那麼客戶端是不知道伺服器曾經崩潰過的(如果不使用套接字選項so_keepalive),客戶端給伺服器傳送訊息。

伺服器崩潰並重啟後丟失了所有的連線資訊,對於接收到的訊息都以rst響應,導致客戶端收到econnreset錯誤。

如果客戶端檢測伺服器的主機崩潰錯誤,那應該設定so_keepalive。

伺服器主機關機

unix系統關機時,由init程序給所有程序傳送sigterm訊號(我們可以捕捉此訊號),然後等待一段時間,然後給所有程序傳送sigkill訊號。程序終止時,所有開啟的描述字都將關閉。

對於伺服器主機關機,客戶最好使用多路復用及時檢測到套接字的關閉。

網路資料格式

1.轉換所有格式的資料為字串訊息

2.明確指定位元組序,在伺服器和客戶端使用同樣的位元組序。

python異常及網路程式設計

使用if作為錯誤處理機制時,無法窮舉所有的異常情況,而且在處理異常時處理 和業務 混合在一起,嚴重影響程式的可讀性。使用raise語句自動引發異常。如果raise語句在try中,則會丟擲runtimeerror異常。如果raise在exception語句中,則會將exception中的異常丟擲。網路...

C 網路程式設計中的異常處理

目錄 l摘要 l 網路程式設計中異常出現場景 l 網路程式設計中的異常處理 l 小結 摘要 異常的處理是為了保證程式盡量在不可預知的意外情況正常執行,同時異常的處理也是比較繁瑣的過程。在網路程式設計中,不可預知的情況更多,使得開發者在程式設計時需要編寫大量的異常處理 本文介紹了 c 中一種簡單的異常...

C 網路程式設計中的異常處理

目錄 l摘要 l網路程式設計中異常出現場景 l網路程式設計中的異常處理 l小結 摘要 異常的處理是為了保證程式盡量在不可預知的意外情況正常執行,同時異常的處理也是比較繁瑣的過程。在網路程式設計中,不可預知的情況更多,使得開發者在程式設計時需要編寫大量的異常處理 本文介紹了c 中一種簡單的異常處理方法...