boost :: asio :: write保证(ACK,校验和)是什么?

时间:2013-01-18 04:37:37

标签: c++ boost tcp boost-asio

我对boost::asio::ip::tcp::socket及相关的写函数有疑问。通过阅读TCP上的Wikipedia article,我明白,TCP包含确认消息和校验和。不幸的是,我在boost :: asio参考中找不到任何关于此的信息。据我所知,boost :: asio使用TCP的OS实现,它应包含两个功能。

我的问题是boost::asio::writeboost::asio::async_write在使用boost::asio::ip::tcp::socket调用时保证的功能是什么。那么,如果函数返回/调用回调函数而没有错误,这意味着什么。我可以想象一些可能性:

  1. 基本上没什么,它只是意味着程序告诉操作系统发送数据,但仅此而已。
  2. 正在进行数据处理,这意味着操作系统已确认已发送数据。
  3. 数据已到达,这意味着收到了来自另一方的确认消息。
  4. 数据已经到达并且没有损坏,与3.相同,校验和加起来。
  5. 如果不是4.有没有办法使用boost :: asio来强制执行此操作(我的意思是在boost :: asio中,而不是自己实现)?

1 个答案:

答案 0 :(得分:3)

它是#1,它应该是这样的。无法保证数据将被发送。

你认为你想要#4,但你真的没有。远程对等方的网络堆栈收到正确数据的事实可能与您的应用程序无关。您真的想知道数据是否被正确接收和处理,这超出了TCP的范围,但很容易在TCP之上实现。 (我建议阅读OSI Model以了解TCP可以做什么。基本上,您希望确保您的数据到达正确的应用程序,或者更多,TCP只能确保它获得至于运行应用程序的计算机。)

要执行您想要的操作,请通过TCP链接发送带内确认。您还可以在确认中放置SHA-2或其他一些数据哈希值。您还可以等待发送确认,直到数据处理完毕 - 例如,等到它已写入磁盘并且已调用fsync()