c++ - Asio 的 write_some 真的会立即返回吗?
问题描述
函数调用 (write_some) 将阻塞,直到成功写入一个或多个字节的数据,或者直到发生错误。
这是功能:
template<
typename ConstBufferSequence>
std::size_t write_some(
const ConstBufferSequence & buffers);
如我们所见,传递了对缓冲区的引用,这意味着 的实现write_some
必须立即完全消耗缓冲区。它不能借用缓冲区供自己稍后写入(写入文件描述符)。
但是,页面中的解释表明它确实是这样做的:一旦写入第一个字节,它就可以返回并继续写入剩余的字节。这怎么可能?调用后可能会破坏对缓冲区的引用。
解决方案
basic_stream_socket::write_some
等效于 Berkley 套接字send()
( or write()
) 函数。
通常send()
会阻塞,直到所有字节都发送完毕。但在极少数情况下,它可能会在仅传输部分数据的那一刻被SIGNAL
处理程序或超时中断。SO_SNDTIMEO
在这种情况下,send
返回发送的字节数 ( one or more bytes
)。并且应该在缓冲区中前进并稍后发送剩余的字节。
推荐阅读
- sql - 如何通过加入创建同一列的不同对?
- angular - 如何避免 Angular 8 中的双向数据绑定
- r - 添加一列但忽略重复项
- java - Jackson XML 序列化:与父级同名的嵌套元素
- python - 在python中使用另一个类中的一个类的用户名
- javascript - 预计 '^169.254$' 在 jasmine 单元测试中为 /^169.254$/
- jquery-ui - 如何创建显示开始日期和结束日期的日期选择器?
- node.js - 在 Angular 8 应用程序中使用 Angular Universal 调试编译错误错误
- c# - 反转列表的特定部分 C#
- algorithm - 评估多项式系数的最佳复杂度