come inviare classi definite in .proto (protocollo-buffer) su un socket
-
19-09-2019 - |
Domanda
Sto cercando di inviare un proto su un socket, ma sto ottenendo errore di segmentazione. Qualcuno potrebbe aiutare e mi dica cosa c'è di sbagliato in questo esempio?
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);
}
Grazie per l'aiuto e le risposte -
Soluzione
Non dovresti scrivere l'oggetto in sé protobuf alla presa. Utilizzare la famiglia SerializeXXX
di metodi per ottenere una sequenza di byte che è possibile scrivere alla presa.
std::string buf;
data.SerializeToString(&buf);
// now you can write buf.data() to the socket
Altri suggerimenti
Per prima cosa, si sta assumendo che una singola chiamata a recv
recupererà tutti i dati. Ancora più importante, però, non si sta andando attraverso il codice di serializzazione / deserializzazione - stai solo leggendo dalla rete e mettere il byte direttamente nell'oggetto. Si deve usare le API di stream-based in buffer protocollo di scrivere e leggere i dati.
Vedere la protocollo buffer C ++ esercitazione per maggiori dettagli - che dà un esempio di salvataggio su disco, ma mi aspetto che la versione di rete sarebbe simile, solo con un flusso diverso.
Dare maggiori dettagli su dove e come si segfaults gestire la connessione tra server e client.
Utilizzare un debugger e stampare il backtrace, vi aiuterà ...