使用 boost::beast 解码 Ntrip 1.0 协议的最佳方法是什么
What is the best way to decode Ntrip 1.0 protocal using boost::beast
我目前正在使用 boost::beast
来实现 ntrip 1.0 客户端。它有这样的请求:
GET /BUCU1 HTTP/1.0 User-Agent: NTRIP GNSSInternetRadio/1.2.0
Authorization: Basic aHVnb2JlbjpodWdvYmVuMTIz
响应如下:
ICY 200 OK
它有非标准的 http 响应。
我作为野兽 http 客户端示例代码,它在缓冲区中获得此响应。但它会在读取函数中产生异常。错误是 "Read, Bad version"。我想知道处理非标准 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
}
这可以使用位于 master 或 develop 分支 (https://github.com/boostorg/beast) 的实验目录中的 icy_stream
class 来完成:
#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);
我目前正在使用 boost::beast
来实现 ntrip 1.0 客户端。它有这样的请求:
GET /BUCU1 HTTP/1.0 User-Agent: NTRIP GNSSInternetRadio/1.2.0 Authorization: Basic aHVnb2JlbjpodWdvYmVuMTIz
响应如下:
ICY 200 OK
它有非标准的 http 响应。
我作为野兽 http 客户端示例代码,它在缓冲区中获得此响应。但它会在读取函数中产生异常。错误是 "Read, Bad version"。我想知道处理非标准 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
}
这可以使用位于 master 或 develop 分支 (https://github.com/boostorg/beast) 的实验目录中的 icy_stream
class 来完成:
#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);