Клиенты WebSocket-сервера изредка получают перемешанные сообщения
Сервер рассылает события подписчикам. Метод отправки:
void Session::send(std::shared_ptr<std::string> msg) {
boost::asio::async_write(socket_, boost::asio::buffer(*msg),
[self = shared_from_this(), msg](error_code ec, size_t) {
if (ec) self->close();
});
}
Когда два события приходят почти одновременно, у клиента разваливается протокол: кадры перемешаны. Всё выполняется в одном strand. Почему?
- Второй async_write начат до окончания первого
- async_write не потокобезопасен даже в strand
- shared_ptr на сообщение освобождается до записи
- Нужно использовать async_write_some вместо async_write
