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

Сервер падает, когда клиент отключается во время чтения

void Session::start() {
    socket_.async_read_some(boost::asio::buffer(buf_),
        [this](error_code ec, size_t n) { onRead(ec, n); });
}

// в сервере:
sessions_.erase(id);   // при отключении, удаляет std::unique_ptr<Session>

При массовых отключениях сервер падает внутри onRead на обращении к buf_. Как правильно управлять временем жизни сессии?

  • Захватывать shared_from_this() в обработчики
  • Проверять this != nullptr в начале onRead
  • Удалять сессию из деструктора сокета
  • Захватывать this по ссылке вместо значения

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

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

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

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