套接字发送的协议缓冲区流类型

时间:2012-06-21 10:51:36

标签: c++ networking protocol-buffers

我试图在socket上发送长度前缀缓冲区。我正在使用协议缓冲区。我用Google搜索,发现可以使用CodedOutputStream中的WriteVarint32来实现。但所有示例都使用文件流或boost 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,以便我可以在正常的套接字发送上发送它。该客户端的功能是向服务器发送一些消息。然后服务器在进行一些格式化之后将它们写入日志文件。

提前感谢你。

1 个答案:

答案 0 :(得分:0)

来自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);