Вступить в клуб →
сложнаявопросСети в Linux: сокеты, epoll и Boost.Asio

Клиенты 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

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела