Google-Protokollpuffer - Fehlende Pflichtfelder, obwohl alle Felder offensichtlich vorhanden sind

8

Ich versuche, eine Protokollbuffer-Nachricht über TCP zu senden, aber auf der Empfangsseite bekomme ich einen Fehler "Fehlende Pflichtfelder" beim Versuch zu analysieren, obwohl anscheinend alle Felder da sind. Ich sende einen 4-Byte-Header vor der Nachricht, die die Länge der Nachricht enthält.

Hier ist die Nachrichtendefinition:

%Vor%

Auf der Client-Seite kodiere ich die Kopfzeile und serialisiere die Nachricht in einen Vektor.

%Vor%

Dies ist ein Hexadezimaldruck des resultierenden Puffers, wobei die ersten 4 Bytes die codierte Nachrichtenlänge (13 Bytes) sind.

%Vor%

Auf der Serverseite empfange ich den Header, dekodiere ihn und empfange dann N Bytes, wobei N die im Header angegebene Nachrichtengröße ist. Der Puffer im Server mit dem Header entfernt ist:

%Vor%

Das ist genau das gleiche wie die eine codierte Clientseite minus der Kopfzeile, aber wenn ich versuche, diesen Puffer zu ParseFromArray zu bekommen, erhalte ich einen Fehler:

%Vor%

Beim Debugging habe ich festgestellt, dass der Punkt, an dem die Decodierung fehlschlägt, in diesem Teil des protobuf-generierten Codes liegt:

%Vor%

has_bits_ wird aus irgendeinem Grund als Null auf der Serverseite gelesen, aber ich kann nicht herausfinden warum.

Irgendwelche Ideen?

Ich verwende boost :: asio für den Netzwerkteil, wenn es darauf ankommt.

Aktualisieren

Wie gewünscht stelle ich den Code bereit, der parseFromArray aufruft.

%Vor%

request_ ist eine ReplayRequest-Membervariable, bis zu diesem Aufruf wird nichts unternommen.

data_buffer_ ist ein Vektor & lt; uint8_t & gt; wo die TCP-Daten empfangen werden.

Ich habe bestätigt, dass es eine korrekte Größe von 13 Bytes hat und dies ist sein hex dump, das ist das gleiche, das ich bekomme, wenn ich die Seite des Pufferclients nach der Serialisierung ablege.

%Vor%

Update 2

Ich bin in der Lage, den Puffer auf der Client-Seite in eine andere Instanz von ReplayRequest zu parsen, d. h .:

%Vor%

test ist erfolgreich mit den richtigen Feldern gefüllt.

    
indiosmo 18.12.2012, 12:58
quelle

1 Antwort

5

Das Problem besteht darin, dass Sie einen Zeiger auf den Vektor und keinen Zeiger auf die Daten der Vektoren übergeben.

anstelle von request_.ParseFromArray( &data_buffer_, data_buffer_.size() );

probiere
request_.ParseFromArray( &data_buffer_[0], data_buffer_.size() );

aus     
g19fanatic 18.12.2012, 13:38
quelle