write_some vs write - boost asio

时间:2016-09-15 17:35:18

标签: c++ boost boost-asio

为什么有人希望在write_some可能无法将所有数据传输到对等端时使用它?

来自boost write_some文档

  

write_some操作可能不会将所有数据传输到对等方。   如果需要确保所有数据,请考虑使用write函数   在阻塞操作完成之前写入。

write_some方法在write方法有什么意义?我查看了boost write_some文档,我无法猜到。

2 个答案:

答案 0 :(得分:6)

在一个极端,write等待,直到所有数据都被确认为写入远程系统。它以最慢的成本为代价,最有把握地成功完成。

在相反的极端,您可以将数据排队等待写入并立即返回。这很快,但根本不能确保数据实际写入。如果路由器出现故障,DNS提供了错误的地址等,您可能会尝试发送到某些无法使用的机器,并且(可能)已经很长时间没有。

write_some是这两个极端之间的中间点。在写入至少某些数据之前它不会返回,因此它可以确保您尝试写入的远程主机当前存在(对于某些,可能相当松散的定义) "目前&#34)。它并不能保证所有数据都会被写入,但可能会更快地完成,并且仍然可以提供一点温暖的模糊"感觉写作可能可能完成。

至于您何时可能想要使用它:显而易见的情况就像通过家用计算机上的本地连接进行大量传输。这里可能存在的问题不在于硬件,而在于计算机(或路由器)配置错误。只要一个字节经过,您就可以确定连接配置正确,并且传输可能会完成。由于转移很大,您可能会节省大量时间作为回报,以最大限度地减少成功完成的保证。

至于你何时想要避免它:几乎可以扭转上述情况。您通过(例如)不可靠的Internet连接发送少量数据。由于您只发送了一些数据,因此您无需在发送所有数据之前返回,从而节省了大量时间。连接不够可靠,传输数据包的几率实际上与其他数据包的几率无关 - 也就是说,发送一个数据包几乎不能告诉你发送下一个数据包的可能性。

答案 1 :(得分:2)

真的没有理由。但这些功能处于不同的层次。

  • basic_stream_socket::write_some是套接字上的一个操作,几乎包含操作系统的send操作(大多数send实现不保证传输完整的消息)。通常,您将此调用包装在循环中,直到发送完所有数据。
  • asio::write是一个高级包装器,它将循环直到发送所有数据。它接受套接字作为参数。

使用write_some的一个可能原因可能是移植基于套接字且已经进行循环的现有代码。