我试图在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,以便我可以在正常的套接字发送上发送它。该客户端的功能是向服务器发送一些消息。然后服务器在进行一些格式化之后将它们写入日志文件。
提前感谢你。
答案 0 :(得分:0)
访问缓冲区内容:
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);