簡體   English   中英

網絡數據包丟失導致客戶端代碼行為異常

[英]Network packet loss causes client code to act strange

我面臨一些問題,需要以最佳方式解決此問題的幫助。

這是問題所在-

我正在運行服務器代碼,其中有一個套接字正在偵聽以接受新的傳入連接。

然后,我嘗試啟動一個客戶端,該客戶端也有一個正在偵聽以接受新傳入連接的套接字。

客戶端代碼開始於在偵聽套接字文件描述符上接受新的連接,並為I / O獲取新的套接字文件描述符。

服務器執行相同的操作,並為I / O獲取新的套接字文件描述符。

注意:客戶端尚未完全啟動。 它需要從服務器接收一些字節並發送一些字節才能啟動。

然后,我通過TCP / IP網絡連接介紹一些數據包丟失。 這會導致某些錯誤(例如:客戶端進程中的recv()系統調用看不到接收到的字節,然后關閉了客戶端的套接字連接,並且相關的新套接字文件描述符也被關閉了。)但是,這使客戶端進程離開了掛起,因為FD_SET中還有其他描述符,但是它們都沒有I / O准備就緒。 因此,pselect()始終為I / O返回0個文件描述符。 客戶端需要先通過連接發送和接收某些字節,然后才能啟動。

我的問題更多是我應該在這里做什么?

當我在accept()系統調用期間創建新的套接字連接時,我對SO_KEEPALIVE選項進行了研究。 但是我認為這不能解決我的問題,尤其是在網絡數據包丟失持續發生的情況下。

如果我意識到沒有文件描述符可供I / O使用,並且永遠不會准備就緒,我應該在這里殺死客戶端進程嗎? 有更好的方法來解決這個問題嗎?

如果我正確地閱讀了該問題,那么問題的核心是:“當中斷了其功能中心的TCP連接時,您的客戶端程序應該怎么做?”

這個問題的答案實際上是一個優先事項-在這種情況下,您希望客戶端程序做什么? 或者換一種說法,您的用戶會發現哪種行為最有用?

在我自己的許多客戶端程序中,都包含了這樣的邏輯:如果與服務器的TCP連接斷開,則客戶端將自動嘗試創建與服務器的新TCP連接,從而盡快恢復其連接性和有用的功能。可能。

另一個明顯的選擇是在斷開連接時讓客戶端退出。 也許帶有某種錯誤指示,以便用戶知道客戶端為什么離開。 (也許是一個錯誤對話框,詢問用戶是否要嘗試重新連接?)

順便說一句,在這種情況下, SO_KEEPALIVE可能不會給您帶來太大幫助-盡管它的名字叫它的目的是幫助程序更及時地發現TCP連接丟失, 而不是更努力地保持TCP連接不會丟失。 (而且甚至還沒有達到這個目的,因為在許多TCP協議棧中,每小時僅發送一個keepalive數據包左右,這意味着即使啟用了SO_KEEPALIVE ,也可能需要很長時間才能使程序開始接收錯誤。反映網絡連接中斷的消息)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM