c - c中的协议(protocol)解析

标签 c parsing protocols

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

问题来了。我目前正在工作中使用二进制协议(protocol)。所有字段都是 8 位长。第一个字段(8 位)是数据包类型。因此,我读取了前 8 位并使用开关/案例调用了一个函数来读取数据包的其余部分,因为我知道了它的大小/结构。但是...其中一些数据包中有嵌套的数据包,所以当我遇到那个特定的数据包时,我必须读取另一个 8-16 字节有另一个开关/案例来查看下一个数据包类型是什么,等等。 (幸运的是,数据包仅嵌套了 2 或 3 层)。 只有在我解码了整个数据包后,我才能将其交给我的状态机进行处理。

我想这也可能是一个更笼统的问题。您必须一次从套接字读取多少数据?越多越好?至于协议(protocol) header 中的“相似”是什么?

因此,尽管这个协议(protocol)相当基础,但我的代码是一大堆 switch/case 语句,而且我从文件/套接字中进行了大量读取,我认为这不是最佳选择。我的主要目标是使这个解码器尽可能快。对于那里更有经验的人来说,这是要走的路还是有更好的方法我还没有想出?这个问题有什么优雅的解决方案吗?

最佳答案

我推荐这种方法:

  1. 尽可能从文件/套接字中读取所有内容(将数据通信与实际协议(protocol)分开)
  2. 将您读取的数据传递给处理数据的过程

伪 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
}

一般来说,为了获得更好的性能,最好尽可能多地阅读。

关于c - c中的协议(protocol)解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2974061/

相关文章:

c - STM32:通过USART接收数据

parsing - Powershell 将 get-winevent 解析为 csv,其中包含所有子对象的 header

java - 五个连续数字的最大乘积

xcode - Swift:协议(protocol)有真正的目的吗?

ios - 应用程序在没有协议(protocol)功能的情况下编译 - 为什么?

c - 捕获输入文本后 Scanf 不会继续

c - 如何使用 openmp 在 c 中进行具有一些 for 循环的任务并行化?

NASM x86 程序集中的 C float

java - 调用 jar 文件中的类时出现 InvokingtargetException

swift - 如何使用 KVO observe 协议(protocol)的属性?