发送到服务器端的消息格式如下:
package test;
message Test {
required int32 id = 1;
required string name = 2;
}
Server.cpp做编码: 字符串缓冲区;
test::Test original;
original.set_id(0);
original.set_name("original");
original.AppendToString(&buffer);
send(acceptfd,buffer.c_str(), buffer.size(),0);
通过这个发送功能,它会将数据发送到客户端,我希望我也没有收到任何错误。
但我的担心如下:
答案 0 :(得分:1)
您应该发送的不仅仅是protobuf消息,以便能够在客户端解码它。
一个简单的解决方案是使用网络字节顺序将buffer.size()
的值作为4字节整数发送到套接字,并发送缓冲区本身。
客户端应首先从套接字读取缓冲区的大小,并将其从网络转换为主机字节顺序。我们用结果值s
表示。然后,客户端必须预先分配大小为s
的缓冲区,并从套接字中读取s
个字节。之后,只需使用MessageLite :: ParseFromString重建您的protobuf。
有关protobuf消息方法的更多信息,请参阅here。
此外,this文件不鼓励使用required
:
您应该非常小心地根据需要标记字段。如果在 有一点你想停止写或发送一个必填字段,它 将字段更改为可选字段(旧字段)会有问题 读者会认为没有这个字段的消息是不完整的 可能会无意中拒绝或放弃它们。你应该考虑写作 缓冲区的特定于应用程序的自定义验证例程 代替。谷歌的一些工程师得出结论 使用要求弊大于利;他们更喜欢只使用 可选和重复。但是,这种观点并不普遍。