【问题标题】:Why boost::asio::ip::tcp::iostream parses input?为什么 boost::asio::ip::tcp::iostream 解析输入?
【发布时间】:2013-04-15 08:31:48
【问题描述】:

我尝试使用 boost ASIO 的 iostream 类从 TCP 套接字读取二进制数据。我使用标准提取运算符(运算符>>)从流中读取数据。我使用的环境是 Visual Studio 2010。 问题是,当我读取流时,流似乎试图将二进制数据解析为字符串。至少这是我在调试代码时所看到的。

有没有办法可以使用 iostream 将其读取为二进制流而不是字符串流?

boost::asio::io_service dataServer;

boost::asio::ip::tcp::endpoint dataServerEndpoint(boost::asio::ip::tcp::v4(), dataServerPort);
boost::asio::ip::tcp::acceptor acceptor(dataServer, dataServerEndpoint);

boost::asio::ip::tcp::iostream dataServerStream;
acceptor.accept(*dataServerStream.rdbuf());

try
{
    vector<char> lineBuffer;

    while (!dataServerStream.eof())
    {

        bool eof = dataServerStream.eof();
        bool bad = dataServerStream.bad();
        bool fail = dataServerStream.fail();
        bool good = dataServerStream.good();

        uint64_t magic;
        dataServerStream >> magic;

因此,它不只是从流中获取 8 个字节并将其移动到“魔术”变量中,而是尝试解析流以获取有效的字符串化数字。这当然会失败,并且会设置失败位。

【问题讨论】:

    标签: c++ boost-asio


    【解决方案1】:

    输入运算符&gt;&gt; 期望输入为文本,然后将其转换为正确的数据类型。正如您所料,这不适用于二进制数据。

    您应该改用read

    uint64_t magic;
    dataServerStream.read(reinterpret_cast<char*>(&magic), sizeof(magic));
    

    您还犯了一个非常常见的初学者错误,即循环while (!eof)。这将不起作用,因为 eof 标志直到 您尝试输入操作后才设置。这意味着您将迭代一次到多次。

    相反,例如

    uint64_t magic;
    while (dataServerStream.read(reinterpret_cast<char*>(&magic), sizeof(magic)))
    {
        // Read the rest
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 2012-12-25
      相关资源
      最近更新 更多