2012-04-05 41 views
2

我有一個使用asio的異步TCP/IP客戶端。當連接丟失時,async_read的句柄函數會收到錯誤。所以我得知連接丟失了。boost asio:如何監控tcp連接是否有效

現在,我重構了一些遺留代碼,實現了一個同步TCP/IP客戶端,其中抽象接口強制執行此序列:同步寫入,然後是同步讀取。 用asio做這件事很簡單,但我想知道異步如果連接丟失。

有沒有更優雅的方式比:

選項A: 添加,檢查線程如果套接字仍然活着(通過嘗試讀取...但我怎麼能肯定的是,讀不從我的同步讀竊取數據見Boost asio ip tcp iostream Error Detection

選項B: 使用async_read代替和,並模擬同步閱讀

+0

我認爲答案是否定的。但也許有一些特定於平臺的解決方案。 – mirk 2012-04-05 13:49:12

+0

我不認爲TCP協議可以檢測到連接失敗,除非它在特定的時間範圍內未收到對發送的數據包的確認。 – Ferruccio 2012-04-05 23:18:01

+0

我已經實現了選項B.但是,有兩件事我不明白1.斷開連接未被檢測到2.如果我拔掉了服務器(即打印機)的以太網電纜,我仍然可以發送數據並且它不返回錯誤。只有第二次,它會拋出一個錯誤 – DoogQc 2012-04-06 20:08:56

回答

2

我會想象的SYN慢性操作將會像異步操作一樣失敗。當同步失敗時,它可能會更具破壞性,因爲超時可能非常長,並且在其他所有事情都必須等待時會更明顯。

您可能想要考慮在套接字上啓用TCP保持活動並可能降低TCP保持活動時間間隔以更快地檢測丟失的連接。

+0

值得一提; TCP-keepalive有一些限制,最值得注意的是沒有便攜的方式(據我所知)設置keepalive的超時時間。而且,默認的超時時間非常長。例如,在Linux上,默認的保活時間間隔爲2小時,在連接被認爲死亡之前,9個探測器必須失敗。 – Rawler 2012-04-08 18:31:14

+0

其實質是,在大多數情況下,您必須求助於在您的應用程序代碼中處理連接超時問題,如果可能的話將「心跳」 - 檢查添加到協議中,並嘗試爲超時設定默認值。 (「這個操作真的需要5秒鐘嗎?」等)「) – Rawler 2012-04-08 18:32:19

相關問題