4

boost::asio::ip::tcp::socket对相关的写入功能有疑问。通过阅读有关 TCP 的Wikipedia 文章,我了解到 TCP 包含确认消息和校验和。不幸的是,我在 boost::asio 参考资料中找不到任何相关信息。据我了解 boost::asio 使用 TCP 的操作系统实现,它应该包含这两个功能。

我的问题boost::asio::writeboost::asio::async_write使用boost::asio::ip::tcp::socket. 那么如果函数返回/回调函数被正确调用是什么意思。我可以想象一些可能性:

  1. 基本上没什么,这只是意味着程序告诉操作系统发送数据,仅此而已。
  2. 数据正在进行中,这意味着操作系统承认它已发送数据。
  3. 数据已到,表示收到对方的确认信息。
  4. 数据已到达且未损坏,与 3 相同。加上校验和相加。

如果不是 4. 有没有办法使用 boost::asio 来强制执行此操作(我的意思是在 boost::asio 内,而不是自己实现)?

4

2 回答 2

3

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

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

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

于 2013-01-18T05:44:03.677 回答
2

将报告本地检测到的错误。也会报连接错误。如果您使用 TCP,则会报告 tcp-ack 失败,但可能在稍后的读取或写入调用中(当通知操作系统 tcp-hack 失败时)。

所以你不能确定当你发出一个 write 时它是否真的收到了。没有写入错误意味着操作系统目前知道您正在使用的 tcp 连接上没有错误,并且他在内部缓冲了您的数据以将其传输到 tcp 对等方。

于 2013-01-18T12:24:54.673 回答