我喜欢实现一种“即发即弃”的流,可以在其中异步追加要在写入过程中写入的数据。可以安全地使用asio::streambuf
吗?
asio::streambuf send_buffer;
bool flushing = false;
asio::ip::tcp::socket socket;
// may be called by timers, read handlers, whatever
void new_data_handler(const char* data, size_t size) {
send_buffer.sputn(data, size);
flush();
}
void flush() {
if (flushing || send_buffer.size() == 0) return;
flushing = true;
asio::async_write(socket, send_buffer, [&](auto, auto) {
// error handling
// as per doc data is consumed from the buffer automatically
flushing = false;
flush(); // not sure if this even needs to be called
});
}
虽然streambuf
本身的生命周期很明确,但我担心添加新数据会使查看到其内存中的所有缓冲区无效。如果可以将其隔离到处理程序中,则可以找到,但是我找不到关于此是否正确的任何文档。
看来
socket.async_write_some(send_buffer, [](auto, auto){});
根本不起作用,需要send_buffer.data()
-如记录所示,该操作将因对send_buffer
的操作而失效。
我也考虑过asio::buffered_write_stream
,但似乎没有提供一种以保证的非阻塞方式转储数据的简单方法。
基础套接字是tcp和ssl套接字。所有处理程序都在同一链中执行。