2013-01-18 57 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()