从streambuf异步写入数据,同时追加到数据

时间:2018-11-23 13:29:39

标签: c++ boost io boost-asio

我喜欢实现一种“即发即弃”的流,可以在其中异步追加要在写入过程中写入的数据。可以安全地使用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套接字。所有处理程序都在同一链中执行。

0 个答案:

没有答案