首页 > 解决方案 > Asio 的 write_some 真的会立即返回吗?

问题描述

根据https://www.boost.org/doc/libs/1_73_0/doc/html/boost_asio/reference/basic_stream_socket/write_some/overload1.html

函数调用 (write_some) 将阻塞,直到成功写入一个或多个字节的数据,或者直到发生错误。

这是功能:

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);

如我们所见,传递了对缓冲区的引用,这意味着 的实现write_some必须立即完全消耗缓冲区。它不能借用缓冲区供自己稍后写入(写入文件描述符)。

但是,页面中的解释表明它确实是这样做的:一旦写入第一个字节,它就可以返回并继续写入剩余的字节。这怎么可能?调用后可能会破坏对缓冲区的引用。

标签: c++asio

解决方案


basic_stream_socket::write_some等效于 Berkley 套接字send()( or write()) 函数。

通常send()会阻塞,直到所有字节都发送完毕。但在极少数情况下,它可能会在仅传输部分数据的那一刻被SIGNAL处理程序或超时中断。SO_SNDTIMEO在这种情况下,send返回发送的字节数 ( one or more bytes)。并且应该在缓冲区中前进并稍后发送剩余的字节。


推荐阅读