2013-01-18 60 views
3

我對boost::asio::ip::tcp::socket及相關的寫入功能有疑問。從閱讀TCP上的Wikipedia article可知,TCP包含確認消息和校驗和。不幸的是,我無法在boost :: asio參考中找到任何有關此信息。據我瞭解,boost :: asio使用TCP的操作系統實現,它應該包含兩個功能。boost :: asio :: write guarantee(ACK,Checksum)是什麼?

我的問題是什麼功能boost::asio::writeboost::asio::async_write保證時調用boost::asio::ip::tcp::socket。那麼,如果函數返回/回調函數被調用時沒有錯誤,這意味着什麼。我可以想象一些可能性:

  1. 基本上什麼都沒有,它只意味着程序告訴操作系統發送數據,但沒有更多。
  2. 數據正在處理中,這意味着操作系統確認它已發送數據。
  3. 數據已到達,表示收到來自對方的確認消息。
  4. 數據已到達且未損壞,與3.相同,並且校驗和相加。

如果它不是4.是否有一種方法來執行此使用boost :: asio(我的意思是在boost :: asio中,而不是自己實現它)?

回答

2

將報告本地檢測到的錯誤。連接錯誤也會被報告。 如果您使用的是TCP,則會報告tcp-ack失敗,但也可能在稍後的讀取或寫入調用(當os被通知tcp-hack失敗時)。

所以你不能確定當你發出一個寫它實際上收到。沒有寫錯誤意味着操作系統當前知道您正在使用的tcp連接上沒有錯誤,並且他在內部緩衝您的數據以將其發送到tcp對等端。

3

它是#1,這是它應該的方式。不能保證數據將被髮送。

你認爲你想要#4,但你真的不需要。遠程對等網絡堆棧接收到正確數據的事實是,可能與您的應用程序無關。你真的想知道數據是否被正確接收和處理,這超出了TCP的範圍,但很容易在TCP之上實現。 (我建議您閱讀OSI Model以瞭解TCP可以實現的功能。基本上,您希望確保您的數據能夠傳送到正確的應用程序,或者更多,並且TCP只能確保它可以達到運行應用程序的計算機)。

要做你想做的事情,通過TCP鏈接發送帶內確認。您也可以將SHA-2或其他數據的散列放入確認中。您也可以等待發送確認,直到數據處理完畢 - 例如,等到它已經寫入磁盤並調用了fsync()