буст зверь соединение веб-сокет закрыть обработчик

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

Я сделал глобальный вектор, который хранит 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<>.

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector