У меня есть такой код, он подключается к 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>, без ссылки. При закрытии поток закрывает соединение, но тогда будет лучше, если поток будет владеть сокетом (благо сокет можно перемещать), а не хранить ссылку - иначе сокет может быть удалён раньше времени.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости