我正在尝试探索Linux平台下的协议缓冲区(PB),我的编码语言是C++。我在protocol buffer online docs中找到了示例,但没有任何特定于socket send和receive的示例(或者我完全错过了:))。所以我决定在实际消息之前添加消息长度,并通过套接字发送它。我会很感激,如果任何人可以建议一个更好的解决方案比我计划做的,也有什么准备在PB创建这样的数据包。
但是我仍然在服务器端遇到了一个问题,我必须解码数据包。假设客户端发送10字节的分组,其中前4字节是分组的长度;但是在解码分组之前不可能知道长度。因此,即使我读取了前4个字节,我如何使用协议缓冲区推导出半读数据包的值。
2条答案
按热度按时间f87krz0w1#
我终于可以让它工作了。我在这里发布代码,以便人们可以审查和评论它,以及如果有人想在c++中实现它,这段代码可以帮助。这是一个破旧的代码,我的意图是让Protobuf工作在长度前缀的方式。我已经采取了一些网站,我不记得客户端服务器的代码,我已经修改它,以适应protobuf。在这里,服务器首先查看套接字并获取总数据包的长度,然后执行实际的套接字读取以读取整个数据包。有无数种方法可以做到这一点,但为了快速解决,我这样做了。但是我需要找到一个更好的方法来避免每个包2个recv,但是在我的条件下所有的消息都是不同大小的,所以这是我猜测的唯一方法。
原文件
字符串
协议缓冲区客户端代码
型
协议缓冲区服务器代码
型
9rnv2umw2#
不幸的是,protobuf并没有提供一种方法来“打包”(定界)你的消息:
如果要将多条消息写入单个文件或流,则由您来跟踪一条消息的结束位置和下一条消息的开始位置。协议缓冲区连线格式不是自定界的,因此协议缓冲区分析器无法自行确定消息的结束位置。解决此问题的最简单方法是在编写消息本身之前编写每个消息的大小。
(from documentation)
所以,他们基本上建议你达到相同的解决方案。