0

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

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

我的客户端代码是

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 以便我可以在普通套接字发送上发送它。该客户端的功能是向服务器发送一些消息。服务器在进行一些格式化后又将它们写入日志文件。

提前谢谢你。

4

1 回答 1

0

来自boost::asio 文档

访问缓冲区内容:

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);
于 2012-06-21T11:36:09.873 回答