как отправить классы, определенные в .proto (протокол-буферы) через сокет - PullRequest
2 голосов
/ 12 марта 2010

Я пытаюсь отправить протокол через сокет, но получаю ошибку сегментации. Может ли кто-нибудь помочь и сказать, что не так с этим примером?

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);
     }  

Спасибо за помощь и ответы -

Ответы [ 3 ]

6 голосов
/ 13 марта 2010

Вы не должны записывать сам объект protobuf в сокет. Используйте семейство методов SerializeXXX, чтобы получить последовательность байтов, которую вы можете записать в сокет.

std::string buf;
data.SerializeToString(&buf);
// now you can write buf.data() to the socket
5 голосов
/ 12 марта 2010

Во-первых, вы предполагаете, что один вызов recv вернет все данные. Что еще более важно, вы не проходите через код сериализации / десериализации - вы просто читаете из сети и помещаете байты непосредственно в объект. Вы должны использовать потоковые API в буферах протокола для записи и чтения данных.

См. Учебник Protocol Buffers C ++ для получения более подробной информации - здесь приведен пример сохранения на диск, но я ожидаю, что сетевая версия будет аналогичной, только с другим потоком.

1 голос
/ 12 марта 2010

Подробно расскажите, где происходит сбой и как вы управляете соединением между сервером и клиентом.

Используйте отладчик и распечатайте обратную трассировку, это поможет ...

...