2

我正在尝试通过套接字发送原型,但出现分段错误。有人可以帮忙告诉我这个例子有什么问题吗?

文件.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

一方面,您假设一次调用recv将检索所有数据。更重要的是,您不会通过序列化/反序列化代码 - 您只是从网络读取并将字节直接放入对象中。您应该使用 Protocol Buffers 中基于流的 API 来写入和读取数据。

有关更多详细信息,请参阅Protocol Buffers C++ 教程- 给出了保存到磁盘的示例,但我希望网络版本会相似,只是使用不同的流。

于 2010-03-12T17:39:14.830 回答
1

提供有关它的段错误以及如何管理服务器和客户端之间的连接的更多详细信息。

使用调试器并打印回溯,这将有助于...

于 2010-03-12T17:42:54.933 回答