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 -

È stato utile?

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à ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top