Мне нравится реализовывать поток «запускай и забывай», где я могу асинхронно добавлять данные, которые должны быть записаны во время записи.Можно ли безопасно использовать 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.Все обработчики выполняются в одной цепочке.