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