Asio 的 write_some 真的会立即 return 吗?
Does Asio's write_some really return immediately?
The function call (write_some) will block until one or more bytes of the data has
been written successfully, or until an error occurs.
函数如下:
template<
typename ConstBufferSequence>
std::size_t write_some(
const ConstBufferSequence & buffers);
如我们所见,传递了对缓冲区的引用,这意味着 write_some
的实现必须立即并完全消耗缓冲区。它不能借用缓冲区供自己稍后写入(到文件描述符)。
然而,页面中的解释表明它确实是这样做的:一旦写入第一个字节,它就可以 return 并继续写入剩余的字节。这怎么可能?对缓冲区的引用可能会在调用后被破坏。
basic_stream_socket::write_some
等同于 Berkley 套接字 send()
(或 write()
)函数。
通常 send()
阻塞,直到发送完所有字节。但在极少数情况下,它可能会在仅传输部分数据的时刻被 SIGNAL
处理程序或超时 SO_SNDTIMEO
中断。在这种情况下,send
returns 发送的字节数 (one or more bytes
)。并且应该在缓冲区中前进并稍后发送剩余的字节。
The function call (write_some) will block until one or more bytes of the data has been written successfully, or until an error occurs.
函数如下:
template<
typename ConstBufferSequence>
std::size_t write_some(
const ConstBufferSequence & buffers);
如我们所见,传递了对缓冲区的引用,这意味着 write_some
的实现必须立即并完全消耗缓冲区。它不能借用缓冲区供自己稍后写入(到文件描述符)。
然而,页面中的解释表明它确实是这样做的:一旦写入第一个字节,它就可以 return 并继续写入剩余的字节。这怎么可能?对缓冲区的引用可能会在调用后被破坏。
basic_stream_socket::write_some
等同于 Berkley 套接字 send()
(或 write()
)函数。
通常 send()
阻塞,直到发送完所有字节。但在极少数情况下,它可能会在仅传输部分数据的时刻被 SIGNAL
处理程序或超时 SO_SNDTIMEO
中断。在这种情况下,send
returns 发送的字节数 (one or more bytes
)。并且应该在缓冲区中前进并稍后发送剩余的字节。