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 に答える