我正在尝试通过TCP发送协议缓冲区消息,但在接收端,我在尝试解析时遇到"Missing required fields"错误,即使显然所有字段都在那里.我在包含消息长度的消息之前发送一个4字节的标头.
这是消息定义:
message ReplayRequest {
required string channel = 1;
required uint32 start = 2;
required uint32 end = 3;
}
Run Code Online (Sandbox Code Playgroud)
在客户端,我正在编写标题并将消息序列化为向量.
ReplayRequest req;
req.set_channel( "channel" )
req.set_start( 1 );
req.set_end( 5 );
int byte_size = req.ByteSize();
std::vector<uint8_t> write_buffer( HEADER_SIZE + byte_size );
encode_header( ... );
req.SerializeToArray( &write_buffer[HEADER_SIZE], byte_size );
Run Code Online (Sandbox Code Playgroud)
这是生成的缓冲区的十六进制打印,其中前4个字节是编码的消息长度(13个字节).
00 00 00 0d 0a 07 63 68 61 6e 6e 65 6c 10 01 18 05
Run Code Online (Sandbox Code Playgroud)
在服务器端,我收到标头,解码它然后接收N个字节,其中N是标头中报告的消息大小.删除标头的服务器中的缓冲区为:
0a 07 63 68 61 6e 6e 65 6c …Run Code Online (Sandbox Code Playgroud)