当它可能无法将所有数据传输给对等方时,为什么有人想要使用
write_some
?
来自 boost
write_some
文档
write_some 操作可能不会将所有数据传输到对等方。 如果需要确保所有数据都被写入,请考虑使用 write 函数 在阻塞操作完成之前写入。
当boost中有
write_some
方法时,write
方法有什么相关性?我浏览了 boost write_some 文档,我什么也猜不到。
在一种极端情况下,
write
会等待,直到所有数据均已确认写入内核缓冲区以传送到远程系统。它以最慢的速度为代价提供了成功完成的最大确定性。
在相反的极端情况下,您可以将数据排队以供 ASIO 写入内核缓冲区,然后立即返回。这很快,但根本不能保证数据会被实际写入。如果路由器出现故障、DNS 提供不正确的地址等,您可能会尝试发送到某些不可用且(可能)已经很长时间不可用的计算机。
write_some
是这两个极端之间的中间点。直到至少有“一些”数据写入内核缓冲区后才会返回。它不能向您保证所有数据都会被写入,但可能会更快地完成,并且仍然给人一种“温暖模糊”的感觉,即写入“可能”完成。
至于您何时可能想要使用它:明显的情况是通过家庭计算机上的本地连接进行大量传输。这里可能的问题不在于硬件,而在于计算机(或路由器)配置错误。为了达到写入内核缓冲区的目的,系统(或多或少)已经确认网络堆栈正在运行,并且找到了(它认为是)远程系统的地址,因此有一个非常好的其余的可能会按预期工作。
至于什么时候你想避免它:几乎与上述情况相反。您正在通过(例如)不可靠的互联网连接发送少量数据。由于您只发送少量数据,因此在发送所有数据之前返回并不能节省太多时间。该连接不够可靠,以至于传输一个数据包的几率实际上与其他数据包的几率无关——也就是说,发送一个数据包并不能告诉您能够发送下一个数据包的可能性。
确实没有理由。但这些功能是不同层次的。
basic_stream_socket::write_some
send
操作(大多数
send
实现不保证传输完整的消息)。通常,您会将此调用包含在一个循环中,直到发送完所有数据为止。asio::write
使用
write_some