Ускоритель

Я новичок в повышении, и я пытаюсь написать простое приложение для чата для websocket. Для справки я использую пример websocket-server-sync с сайта.

Я сделал глобальный вектор, который хранит websocket::streams, и в методе do_session после создания websocket я помещаю его в вектор.

std::vector<websocket::stream<tcp::socket>*> socket_streams;

Каждый раз, когда я читаю сообщение, я отправляю его всем из этого вектора, так что пока оно работает хорошо. Однако, когда кто-то закрывает соединение (даже если оно не закрыто должным образом, например, интернет-соединение прерывается), я хочу удалить объект потока из моего вектора. Я пытался искать в заголовках зверя "близкий обработчик" или что-то в этом роде, но ничего не смог найти. Есть ли способ сделать это? Подобно:

void close_handler(websocket::stream<tcp::socket>* _stream) 
{
   //remove _stream from socket_streams
}

1 ответ

Решение

Из того, что я понимаю, ваша проблема состоит в том, чтобы продлить время жизни потока за пределы предложения try / catch.

Сохраняя предположение, что конструктор может выдать, вы можете использовать конструктор копирования внутри try:

void do_session(tcp::socket& socket)
{
    websocket::stream<tcp::socket> ws;
    try
    {
        ws = std::move(websocket::stream<tcp::socket>>(std::move(socket)));
        add_socket(&ws);
        // ....
    }
    catch(boost::system::system_error const& se) { ... }
    catch(std::exception const& e) {}

    erase_socket_if_exists(&ws);
}

Если бы назначение перемещения не существовало, вы могли бы использовать std::uniq_ptr<>.

Обратите внимание, что вы не можете избежать состояния гонки при попытке записи в закрытый поток. Вот почему вы должны обрабатывать случай, когда запись вызывает исключение.

Также обратите внимание, что с вашей схемой вы должны удерживать блокировку контейнера, пока не закончите запись во все сокеты.

Другие вопросы по тегам