boost::asio websocket С++

195
06 мая 2018, 20:21

У меня есть такой код, он подключается к 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));
   }
Answer 1

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

READ ALSO
Не коннектится слот Qt5

Не коннектится слот Qt5

Задача с вероятно очень глупой ошибкой перенесенная на тестовый проект:

189
Как работает данный код для шифрования слова шифром Цезаря?

Как работает данный код для шифрования слова шифром Цезаря?

Откопал код шифра Цезаря на C++ Собственно, вот он:

201
С++ в Visual Studio

С++ в Visual Studio

Решил проверить код из книги ООП в С++ Лафоре но в Visual Studio не получается его повторить

164
Диалоговое окно для выбора файла потока ввода

Диалоговое окно для выбора файла потока ввода

Написал простой векторный редактор и сохранение изображения идет в текстовый документКак сделать чтобы при нажатии на соответствующую...

191