Каков наилучший способ расшифровки протокала Ntrip 1.0 с использованием boost :: beast - PullRequest
0 голосов
/ 07 июня 2018

В настоящее время я использую boost::beast для реализации клиента ntrip 1.0.Он имеет запрос вроде:

GET / BUCU1 HTTP / 1.0 Пользователь-агент: NTRIP GNSSInternetRadio / 1.2.0 Авторизация: Basic aHVnb2JlbjpodWdvYmVuMTIz

И ответ как:

ICY 200 OK

Имеет нестандартный http-ответ.

Я, как пример кода http-клиента, получает этот ответ вбуфер.Но он генерирует исключение в функции чтения.Ошибка «Чтение, неверная версия».Мне интересно, как лучше всего обработать нестандартный http-ответ.

void
    on_write(
        boost::system::error_code ec,
        std::size_t bytes_transferred)
{
    boost::ignore_unused(bytes_transferred);

    if (ec)
        return fail(ec, "write");


    // Receive the HTTP response
    // boost::beast::flat_buffer buffer_; // (Must persist between reads)
    // http::response <http::string_body> res_;

    http::async_read(socket_, buffer_, res_,
        std::bind(
            &session::on_read,
            shared_from_this(),
            std::placeholders::_1,
            std::placeholders::_2));
}

void
    on_read(
        boost::system::error_code ec,
        std::size_t bytes_transferred)
{
    boost::ignore_unused(bytes_transferred);

    if (ec)
        return fail(ec, "read");         // ex
}

1 Ответ

0 голосов
/ 10 июня 2018

Это может быть выполнено с использованием класса icy_stream, расположенного в экспериментальном каталоге в мастер-файле или в ветвях разработки (https://github.com/boostorg/beast):

#include <boost/beast/experimental/http/icy_stream.hpp>
...
using http = boost::beast::http;
using tcp = boost::asio::ip::tcp;
...
boost::asio::io_context ioc;
http::icy_stream<tcp::socket> stream(ioc);
http::response<http::string_body> res;
...
http::read(stream, res);
...