I suspect that somewhere in your pipeline, the data is being interpreted as a C-style NUL-terminated string and thus being truncated at the first zero-value byte.
On Wed, Jun 16, 2010 at 2:20 PM, DFlo <dflo...@raptr.com> wrote: > Keeping this as short as possible, I'm using protobuf to communicate > over a named-pipe on Windows, between a C++ "server" and a Python > "client", and seeing cases where the Python parser clearly does not > get all the data (example follows) or in other cases raises a > "Truncated Message." exception. > > Is this a known problem? I didn't see anything obvious posted about > it in this group.... If so, is there a fix or a known workaround? > Otherwise, the system exchanges other messages well into the thousands > without any apparent difficulty; the issue is specifically limited to > this one message class. Any insight would be greatly appreciated.... > > Here is one example of what's being sent by C++ (including the hex of > the serialized bytestream): > > 2010/06/16 11:37:17: DEBUG: sendServerMsg: sending (371 bytes): > which_message: QUERY > query { > sequence_number: 36 > which_query: ACCOUNTS > accounts { > username: "raptrguest9351...@raptr.com" > protocol: "prpl-jabber" > is_connected: false > status: DISCONNECTED > } > accounts { > username: "raptrguest8707...@raptr.com" > protocol: "prpl-jabber" > is_connected: false > status: DISCONNECTED > } > accounts { > username: "raptrguest6531...@raptr.com" > protocol: "prpl-jabber" > is_connected: false > status: DISCONNECTED > } > accounts { > username: "d...@raptr.com" > protocol: "prpl-jabber" > is_connected: true > status: CONNECTED > } > accounts { > username: "dflo_n...@raptr.com" > protocol: "prpl-jabber" > is_connected: false > status: DISCONNECTED > } > accounts { > username: "daveflo...@mac.com" > protocol: "prpl-aim" > is_connected: false > status: CONNECTING > } > accounts { > username: "dwflorek" > protocol: "prpl-yahoo" > is_connected: false > status: CONNECTING > } > accounts { > username: "dflo...@gxlinc.com" > protocol: "prpl-jabber" > is_connected: false > status: CONNECTING > } > accounts { > username: "raptr_d...@hotmail.com" > protocol: "prpl-msn" > is_connected: false > status: CONNECTING > } > } > 2010/06/16 11:37:17: DEBUG: sendServerMsg: bytes: [08 06 32 ff 02 10 > 24 38 01 42 2e 0a 1b 72 61 70 74 72 67 75 65 73 74 39 33 35 31 37 31 > 38 40 72 61 70 74 72 2e 63 6f 6d 12 0b 70 72 70 6c 2d 6a 61 62 62 65 > 72 18 00 20 05 42 2e 0a 1b 72 61 70 74 72 67 75 65 73 74 38 37 30 37 > 38 33 31 40 72 61 70 74 72 2e 63 6f 6d 12 0b 70 72 70 6c 2d 6a 61 62 > 62 65 72 18 00 20 05 42 2e 0a 1b 72 61 70 74 72 67 75 65 73 74 36 35 > 33 31 32 33 32 40 72 61 70 74 72 2e 63 6f 6d 12 0b 70 72 70 6c 2d 6a > 61 62 62 65 72 18 00 20 05 42 21 0a 0e 64 66 6c 6f 40 72 61 70 74 72 > 2e 63 6f 6d 12 0b 70 72 70 6c 2d 6a 61 62 62 65 72 18 01 20 03 42 26 > 0a 13 64 66 6c 6f 5f 6e 30 30 62 40 72 61 70 74 72 2e 63 6f 6d 12 0b > 70 72 70 6c 2d 6a 61 62 62 65 72 18 00 20 05 42 22 0a 12 64 61 76 65 > 66 6c 6f 72 65 6b 40 6d 61 63 2e 63 6f 6d 12 08 70 72 70 6c 2d 61 69 > 6d 18 00 20 02 42 1a 0a 08 64 77 66 6c 6f 72 65 6b 12 0a 70 72 70 6c > 2d 79 61 68 6f 6f 18 00 20 02 42 25 0a 12 64 66 6c 6f 72 65 6b 40 67 > 78 6c 69 6e 63 2e 63 6f 6d 12 0b 70 72 70 6c 2d 6a 61 62 62 65 72 18 > 00 20 02 42 26 0a 16 72 61 70 74 72 5f 64 66 6c 6f 40 68 6f 74 6d 61 > 69 6c 2e 63 6f 6d 12 08 70 72 70 6c 2d 6d 73 6e 18 00 20 02] > > Python gets the correct number of bytes, but fails to parse the entire > message (it misses the enumerated 'status' value, and then doesn't > find the other N account entries either): > > 2010/06/16 11:37:17: DEBUG: MainThread: readHandleServerMsg: got 371- > byte block > 2010/06/16 11:37:17: DEBUG: MainThread: readHandleServerMsg: received > msg: > which_message: QUERY > query { > sequence_number: 36 > which_query: ACCOUNTS > accounts { > username: "raptrguest9351...@raptr.com" > protocol: "prpl-jabber" > is_connected: false > } > } > > A stripped down version of my .proto file is: > > message RaptrClientPing { > optional int32 timestamp = 1; > optional int32 sequence_number = 2; > // ... > } > > message RaptrClientHeartbeat { > optional int32 timestamp = 1; > optional int32 sequence_number = 2; > // ... > } > > message RaptrClientError { > optional int32 timestamp = 1; > optional int32 sequence_number = 2; > // ... > } > > message RaptrClientQuery { > enum WhichQuery { > ACCOUNTS = 1; > // ... > } > enum AccountStatus { > ERROR = 1; CONNECTING = 2; CONNECTED = 3; > DISCONNECTING = 4; DISCONNECTED = 5; > } > message Account { > optional string username = 1; > optional string protocol = 2; > optional bool is_connected = 3; > optional AccountStatus status = 4; > optional string error_msg = 5; > } > optional int32 timestamp = 1; > optional int32 sequence_number = 2; > optional int32 in_response_to = 3; > optional string username = 4; > optional string protocol = 5; > optional string buddy_name = 6; > optional WhichQuery which_query = 7; > // response items, depending on what was queried > repeated Account accounts = 8; > // ... > } > > message RaptrClientArbitraryMessage { > enum WhichMessage { > NONE = 1; > // 2 is currently unused > PING = 3; > HEARTBEAT = 4; > ERROR = 5; > QUERY = 6; > // ... > } > > // Identifies which field is filled in. > optional WhichMessage which_message = 1; > > // At most one of the following will be filled in. > // 2 is currently unused > optional RaptrClientPing ping = 3; > optional RaptrClientHeartbeat heartbeat = 4; > optional RaptrClientError error = 5; > optional RaptrClientQuery query = 6; > // ... > } > > -- > You received this message because you are subscribed to the Google Groups > "Protocol Buffers" group. > To post to this group, send email to proto...@googlegroups.com. > To unsubscribe from this group, send email to > protobuf+unsubscr...@googlegroups.com<protobuf%2bunsubscr...@googlegroups.com> > . > For more options, visit this group at > http://groups.google.com/group/protobuf?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To post to this group, send email to proto...@googlegroups.com. To unsubscribe from this group, send email to protobuf+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/protobuf?hl=en.