2

ソケット経由でプロトを送信しようとしていますが、セグメンテーション エラーが発生します。誰かが助けて、この例のどこが悪いのか教えてもらえますか?

file.proto

message data{  
    required string x1 = 1;
    required uint32 x2 = 2;
    required float x3 = 3;
}

xxx.cpp

    ...
    data data_snd, data_rec;

    //sending data to the server
    if (send(socket, &data_snd, sizeof(data_snd), 0) < 0) {
       cerr << "send() failed" ;
       exit(1);
     }  

     //receiving data from the client
     if (recv(socket, &data_rec, sizeof(data_rec), 0) < 0) {
        cerr << "recv() failed";
        exit(1);
     }  

助けと返信をありがとう-

4

3 に答える 3

6

protobuf オブジェクト自体をソケットに書き込むことは想定されていません。一連のメソッドを使用しSerializeXXXて、ソケットに書き込むことができる一連のバイトを取得します。

std::string buf;
data.SerializeToString(&buf);
// now you can write buf.data() to the socket
于 2010-03-13T08:30:03.067 に答える
5

まず、 を 1 回呼び出すだけでrecvすべてのデータが取得されると想定しています。ただし、さらに重要なことは、シリアライゼーション/デシリアライゼーション コードを実行していないことです。ネットワークから読み取って、バイトをオブジェクトに直接入れているだけです。データの書き込みと読み取りには、プロトコル バッファーでストリームベースの API を使用する必要があります。

詳細については、Protocol Buffers C++ チュートリアルを参照してください。これは、ディスクへの保存の例を示していますが、ストリームが異なるだけで、ネットワーク バージョンは似ていると思います。

于 2010-03-12T17:39:14.830 に答える