У меня есть такой код, он подключается к websocket серверу и отправляет сообщения, но при каждой отправки он создаёт новое подключение на сервере и потом его закрывает, как сделать так что-бы он подключился один раз ?
void send(std::string text) {
std::string const host = "localhost";
boost::asio::io_service ios;
boost::asio::ip::tcp::resolver r{ ios };
boost::asio::ip::tcp::socket sock{ ios };
boost::asio::connect(sock, r.resolve(boost::asio::ip::tcp::resolver::query{ host, "8081" }));
//WebSocket connect and send message using beast
boost::beast::websocket::stream<boost::asio::ip::tcp::socket&> ws{ sock };
ws.handshake(host, "/");
ws.write(boost::asio::buffer(text));
}
Просто вынесите создание соединения websocket-потока и храните сокет с потоком до тех пор, пока они нужны. Для соединения не имеет никакого значения, что сервер использует websocket - в основе обоих лежит tcp/ip, websocket влияет только на формат пакета. Соответственно, ничего не мешает писать в поток несколько раз - он должен сам подставить все нужные заголовки. Да и в целом интерфейс сделан так, чтобы быть походим на websocket - а там никаких сложностей с отправкой нет.
Возможное решение:
void send(boost::beast::websocket::stream& ws, const std::string& text) {
ws.write(boost::asio::buffer(text));
}
void foo(){
std::string const host = "localhost";
boost::asio::io_service ios;
boost::asio::ip::tcp::resolver r{ ios };
boost::asio::ip::tcp::socket socket{ ios };
boost::asio::connect(socket, r.resolve(boost::asio::ip::tcp::resolver::query{ host, "8081" }));
boost::beast::websocket::stream<boost::asio::ip::tcp::socket&> ws{ socket };
ws.handshake(host, "/");
for(int i = 0; i < 20; ++i){
send(ws, std::to_string(i));
}
}
И по моему правильный тип для потока - websocket::stream<boost::asio::ip::tcp::socket>
, без ссылки. При закрытии поток закрывает соединение, но тогда будет лучше, если поток будет владеть сокетом (благо сокет можно перемещать), а не хранить ссылку - иначе сокет может быть удалён раньше времени.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Откопал код шифра Цезаря на C++ Собственно, вот он:
Решил проверить код из книги ООП в С++ Лафоре но в Visual Studio не получается его повторить
Написал простой векторный редактор и сохранение изображения идет в текстовый документКак сделать чтобы при нажатии на соответствующую...