我一直在努力实现一些协议解码器,但每次遇到一个“简单”的问题,我觉得我解决问题的方式并不是最佳的,而且一定要有更好的办法.我正在使用C.目前我正在使用一些罐头数据并将其作为文件读取,但后来将通过TCP或UDP.
这是问题.我正在工作中使用二进制协议.所有字段都是8位长.第一个字段(8bits)是数据包类型.所以我读了前8位,并使用一个开关/ case我调用一个函数来读取数据包的其余部分,因为我知道它的大小/结构.但是这些数据包中有些包含有嵌套数据包,所以当我遇到特定数据包时,我必须再读取8-16个字节,有另一个开关/情况可以查看下一个数据包的类型,并打开. (幸运的是,数据包只嵌套2或3深).
只有一次我将整个数据包解码才能处理到我的状态机进行处理.
我想这可以是一个更一般的问题.您一次从套接字读取多少数据?越多越好?与协议头中的“相似”一样多吗?
所以即使这个协议是相当基本的,我的代码是一堆switch / case语句,我做了很多从文件/套接字的读取,我觉得不是最佳的.我的主要目标是使解码器尽可能快.对于那些更有经验的人来说,这是要走还是有更好的方式,我还没有想到呢?任何优雅的解决这个问题?
解决方法
我推荐这种方法:
>从文件/套接字中读取所有可以的数据(将数据通信与实际协议分开)
>将您读取的数据传递给处理数据的过程
伪C代码(想象destinationBuffer是一个circular buffer – 我认为这样的数据结构对于需要解析大量传入数据的应用程序来说至关重要):
forever() { // this function adds data to the buffer updating it read_all_you_can(destinationBuffer); ... handle_data(destinationBuffer); // the buffer is automatically adjusted in order // to reflect how much of the data was processed }
一般来说,尽可能多地阅读以获得更多的性能.