【问题标题】:write_some vs write - boost asiowrite_some vs write - 提升 asio
【发布时间】:2016-09-15 17:35:18
【问题描述】:

write_some 可能无法将所有数据传输给对等方时,为什么有人要使用它?

来自 boost write_some 文档

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

write_some 方法在 boost 中有 write 方法时的相关性是什么?我浏览了 boost write_some 文档,没有什么我能猜到的。

【问题讨论】:

  • @DeathTails:不是。在问这个问题之前我已经阅读了这个问题。

标签: c++ boost boost-asio


【解决方案1】:

在一种极端情况下,write 会等待,直到所有数据都被确认已写入远程系统。它以最慢的速度为代价提供了成功完成的最大确定性。

在相反的极端,您可以将数据排队等待写入并立即返回。这很快,但完全不能保证数据会被实际写入。如果路由器出现故障、DNS 提供了不正确的地址等,您可能会尝试向某些不可用且(可能)很久没有可用的机器发送数据。

write_some 是这两个极端之间的中间点。它在至少 some 数据被写入之前不会返回,因此它向您保证您尝试写入的远程主机当前确实存在(对于某些可能相当松散的“当前”)。它不能保证所有数据都将被写入,但可能会更快地完成,并且仍然给人一种“温暖模糊”的感觉,即写入可能完成。

至于您何时可能想要使用它:显而易见的情况是通过家用计算机上的本地连接进行大量传输。这里可能的问题不是硬件,而是计算机(或路由器)配置错误。一旦一个字节通过,您就可以确信连接配置正确,并且传输可能会完成。由于转移的规模很大,您可能会节省大量时间,以换取对成功完成的保证的最小损失。

至于你什么时候想避免它:几乎与上述情况相反。您通过(例如)不可靠的 Internet 连接发送少量数据。由于您只发送少量数据,因此在发送所有数据之前返回并不会节省太多时间。连接不够可靠,以至于一个数据包被传输的几率实际上与其他数据包的几率无关——也就是说,发送一个数据包并不能告诉您能够发送下一个数据包的可能性。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      相关资源
      最近更新 更多