【问题标题】:boost::asio::streambuf empty?boost::asio::streambuf 为空?
【发布时间】:2011-08-06 11:46:44
【问题描述】:

我正在使用 boost::asio::streambuf 将 ostream 写入我的 boost 套接字。

Name name;
name.set_name("platzhirsch");

boost::asio::streambuf b;
std::ostream os(&b);

ZeroCopyOutputStream *raw_output = new OstreamOutputStream(&os);
CodedOutputStream *coded_output = new CodedOutputStream(raw_output);

coded_output->WriteVarint32(name.ByteSize());
name.SerializeToCodedStream(coded_output);

socket.send(b.data());

但是,send 返回的 size_t 为 0。我怀疑根本没有发送任何数据。也因为客户端套接字抛出了可怕的异常。我在问,我的代码是否有什么奇怪的地方。

也就是说,我可以测试streambuf是否为空或者写入的数据是否真的存在。

【问题讨论】:

    标签: c++ sockets boost stream


    【解决方案1】:

    不确定您的代码。这对我有用:

        boost::asio::streambuf request;
        std::ostream request_stream(&request);
        request_stream << "GET " << queryArgs << " HTTP/1.0\r\n";
        request_stream << "Host: " << serverIp  /* "192.168.0.70" */ << "\r\n";
        request_stream << "Accept: */*\r\n";
        request_stream << "Connection: close\r\n\r\n";
    
        // Send the request.
        boost::asio::write(socket, request);
    

    【讨论】:

      【解决方案2】:

      不是 boost::asio 的问题,是 Google protobuf 的问题。

      为了刷新 CodedOutputStream,它们必须被删除:

      ZeroCopyOutputStream *raw_output = new OstreamOutputStream(&os);
      CodedOutputStream *coded_output = new CodedOutputStream(raw_output);
      
      coded_output->WriteVarint32(name.ByteSize());
      name.SerializeToCodedStream(coded_output);
      
      delete coded_output;
      delete raw_output;
      
      socket.send(b.data());
      

      【讨论】:

      • 您不必动态分配流,而是可以使用块来控制堆栈对象的生命周期。有关完整答案,请参阅stackoverflow.com/a/20397980/891439。为了完整起见,我只添加了此评论,因为我不得不用谷歌搜索很多东西才能找到解决方案。
      • @FlorianWolters 随意添加您自己的答案。我很高兴接受另一个答案,但我的。
      • 我认为评论已经足够了,但是ty!
      猜你喜欢
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 2018-04-09
      • 2016-09-19
      相关资源
      最近更新 更多