当前位置:  开发笔记 > 程序员 > 正文

c中的协议解析

如何解决《c中的协议解析》经验,为你挑选了1个好方法。

我一直在尝试实现一些协议解码器,但每次遇到"简单"问题时我觉得我解决问题的方式并不是最优的,必须有更好的方法来做事.我正在使用C.目前我正在使用一些固定数据并将其作为文件读取,但稍后它将通过TCP或UDP.

这是问题所在.我正在玩二进制协议.所有字段都是8位长.第一个字段(8位)是数据包类型.所以我在前8位读取并使用一个开关/情况我调用一个函数来读取数据包的其余部分,因为我知道它的大小/结构.但是......其中一些数据包里面有嵌套数据包,所以当我遇到那个特定的数据包时,我必须再读取另外一个8-16字节的另一个交换机/情况,看看下一个数据包类型是什么,然后打开.(幸运的是,数据包只嵌套2或3深).只有将整个数据包解码后,才能将其处理到我的状态机进行处理.

我想这也是一个更普遍的问题.你一次从套接字读取多少数据?越多越好?协议标题中的"类似"是什么?

所以即使这个协议是相当基本的,我的代码是一大堆switch/case语句,我从文件/套接字中做了很多阅读,我觉得这不是最优的.我的主要目标是尽可能快地制作这个解码器.对于那些经验丰富的人来说,这是要走的路还是有一种更好的方式,我还没想到呢?这个问题的优雅解决方案?



1> INS..:

我推荐这种方法:

    从文件/套接字中读取所有内容(将数据通信与实际协议分开)

    将您读过的数据传递给处理数据的过程

伪C代码(想象一下destinationBuffer是一个循环缓冲区 - 我相信这种数据结构对于需要解析大量传入数据的应用程序至关重要):

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
}

通常,为了获得更高的性能,最好尽可能多地阅读.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有