【问题标题】:Protocol buffer stream type for socket send套接字发送的协议缓冲区流类型
【发布时间】:2012-06-21 10:51:35
【问题描述】:

我试图在套接字上发送以长度为前缀的缓冲区。我正在使用协议缓冲区。我搜索了一下,发现可以使用 CodedOutputStream 中的 WriteVarint32 来实现。但所有示例都使用文件流或提升 asio。普通的套接字发送需要一个 void * 作为缓冲区来通过套接字发送,但是当使用 boost asio 完成时,我得到以下错误

错误:从类型“boost::asio::const_buffers_1”到类型“void*”的无效转换

我的客户端代码是

Person payload ;
payload.set_log_msg("We are using protobuf");
boost::asio::streambuf b;
std::ostream os(&b);

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

coded_output->WriteVarint32(payload.ByteSize());
payload.SerializeToCodedStream(coded_output);
delete coded_output;
delete raw_output;
.
.
.
bytecount=send(hsock, (void *) b.data(), 10,0);

我的 message.proto 文件的内容是

message Person {
  required fixed64 log_time =1;
  required fixed32 log_micro_sec =2;
  required fixed32 sequence_no =3;
  required fixed32 shm_app_id =4;
  required string packet_id =5;
  required string log_level=6;
  required string log_msg=7;

  }

任何人都可以帮助我用其他东西替换 boost::asio::streambuf 以便我可以在正常的套接字发送上发送它。该客户端的功能是向服务器发送一些消息。然后服务器在进行一些格式化后将它们写入日志文件。

提前谢谢你。

【问题讨论】:

    标签: c++ networking protocol-buffers


    【解决方案1】:

    来自boost::asio documentation

    访问缓冲区内容:

    boost::asio::const_buffer b1 = ...;
    std::size_t s1 = boost::asio::buffer_size(b1);
    const unsigned char* p1 = boost::asio::buffer_cast<const unsigned char*>(b1);
    

    所以你可以打电话:

    bytecount = send(hsock, 
                     boost::asio::buffer_cast<const unsigned char*>(b.data()),  
                     boost::asio::buffer_size(b.data()), 
                     0);
    

    【讨论】:

    • g++ Client.cpp ../message.pb.o -I../ -I /root/boost_1_41_0/ -lprotobuf Client.cpp: 在函数'int main(int, char**) ':Client.cpp:100:错误:没有匹配函数调用'buffer_cast(boost::asio::streambuf&)' Client.cpp:101:错误:没有匹配函数调用'buffer_size(boost::asio: :streambuf*)' /root/boost_1_41_0/boost/asio/buffer.hpp:148: 注意:候选是:size_t boost::asio::buffer_size(const boost::asio::mutable_buffer&) /root/boost_1_41_0/boost/ asio/buffer.hpp:318: 注意: size_t boost::asio::buffer_size(const boost::asio::const_buffer&) 出错
    • 其实它的 oost::asio::buffer_cast(b.data()),非常感谢您的帮助
    猜你喜欢
    • 2013-02-16
    • 1970-01-01
    • 2023-03-29
    • 2022-01-20
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多