write_some 与 write - boost asio

问题描述 投票:0回答:2

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

write_some

来自 boost

write_some
文档

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

当boost中有

write_some
方法时,
write
方法有什么相关性?我浏览了 boost write_some 文档,我什么也猜不到。

c++ boost boost-asio
2个回答
8
投票

在一种极端情况下,

write
会等待,直到所有数据均已确认写入内核缓冲区以传送到远程系统。它以最慢的速度为代价提供了成功完成的最大确定性。

在相反的极端情况下,您可以将数据排队以供 ASIO 写入内核缓冲区,然后立即返回。这很快,但根本不能保证数据会被实际写入。如果路由器出现故障、DNS 提供不正确的地址等,您可能会尝试发送到某些不可用且(可能)已经很长时间不可用的计算机。

write_some
是这两个极端之间的中间点。直到至少有“一些”数据写入内核缓冲区后才会返回。它不能向您保证所有数据都会被写入,但可能会更快地完成,并且仍然给人一种“温暖模糊”的感觉,即写入“可能”完成。 至于您何时可能想要使用它:明显的情况是通过家庭计算机上的本地连接进行大量传输。这里可能的问题不在于硬件,而在于计算机(或路由器)配置错误。为了达到写入内核缓冲区的目的,系统(或多或少)已经确认网络堆栈正在运行,并且找到了(它认为是)远程系统的地址,因此有一个非常好的其余的可能会按预期工作。 至于什么时候你想避免它:几乎与上述情况相反。您正在通过(例如)不可靠的互联网连接发送少量数据。由于您只发送少量数据,因此在发送所有数据之前返回并不能节省太多时间。该连接不够可靠,以至于传输一个数据包的几率实际上与其他数据包的几率无关——也就是说,发送一个数据包并不能告诉您能够发送下一个数据包的可能性。

确实没有理由。但这些功能是不同层次的。


5
投票

basic_stream_socket::write_some
  • 是套接字上的一项操作,它几乎包装了操作系统的 send
     操作(大多数 
    send
    实现不保证传输完整的消息)。通常,您会将此调用包含在一个循环中,直到发送完所有数据为止。
    asio::write
  • 是一个高级包装器,它将循环直到发送所有数据。它接受套接字作为参数。
    
    
    使用
    write_some
  • 的一个可能原因可能是在移植基于套接字并且已经执行循环的现有代码时。


© www.soinside.com 2019 - 2024. All rights reserved.