2016-02-04 84 views
0

我想我的問題對你來說很容易,但我找不到明確的解釋我的問題。我必須確定我對C++很陌生。在沒有連接的套接字中寫入時沒有錯誤

我想創建一個非常簡單的TCP客戶端,使用boost :: asio套接字。我實際上有一些與同步調用工作。但在某些時候,我停止與我的服務器連接(通過關閉我的WiFi)和插座繼續沒有任何錯誤寫。

由於TCP協議是應該發送一個ACK消息,我認爲,失去了我的連接將被寫入呼叫進行檢測。

我看了一則關於KEEP_ALIVE很多東西的,大約在每一個類似的問題本地插座和異步寫入,但似乎沒有回答我的特定問題。

這裏是我的代碼的一部分,我嘗試寫和檢測丟失的連接。不知道,這將有助於..

try { 
     boost::system::error_code error; 
     boost::asio::write(socket_, boost::asio::buffer(message), error); 
    } 
    catch (std::exception& e) 
    { 
     ReportError(e.what());try { 
    boost::system::error_code error; 
    boost::asio::write(socket_, boost::asio::buffer(message), error); 
    if (error) { 
     is_server_up = false; 
    } 
} 
catch (std::exception& e) 
{ 
    ReportError(e.what()); 
} 
    } 

所以我的問題是:

  • 是否有關於如何檢測,我錯過了vaste萬維網上書寫錯誤的任何簡單的解釋?
  • 我是否使用boost :: asio的正確函數?

PS:如何提高我的實現任何評論是非常歡迎!

+0

數據進入TCP IP發送窗口,直到端口正式關閉或您填滿窗口後纔會聽到投訴。與此同時,TCP正在愉快地嘗試發送該數據,並將繼續嘗試,直到地獄凍結。衆所周知,網絡中斷是暫時的,下一次嘗試數據將被髮送。 – user4581301

+0

有什麼辦法讓地獄凍結真的很快呢? –

+0

不是。 TCP被設計爲發送數據或死亡嘗試。你可能不得不建立一個保持活力的方案來檢測你是否有連接。 – user4581301

回答

1

由於TCP協議應該發送ACK消息,我相信我的連接丟失會被寫入調用檢測到。

是的,這將是。但是write不會等待確認,這會使應用程序不必要地變慢。連接丟失將在稍後發現,最終讀取和寫入操作將失敗並顯示錯誤。

如果進行至少一次成功的寫操作連接丟失後,即寫入最終將失敗。每次發生故障後嘗試進行讀取或寫入操作都會報告錯誤。

相關問題