【问题标题】:Correct way to parse network packet in C在C中解析网络数据包的正确方法
【发布时间】:2013-01-31 19:54:41
【问题描述】:

(如果我不能正确提出问题,请原谅。英语不是我的主要语言。)

我正在尝试解析 SyncE ESMC 数据包。是以太网慢速协议包。

方法一: 为了解析这个数据包,我使用了类似于 here 的逐字节方法。

方法 2: 解析数据包的其他方法是定义一个“结构”来表示整个数据包并访问各个字段以检索特定偏移处的值。 然而,在这种方法中,结构填充和对齐可能会出现(我不确定),但在 Linux 上,各种数据包头以结构形式定义,例如ip.h 中的 iphdr IP 数据包(缓冲区)可以强制转换为“iphdr”以检索 ip 标头字段,因此它必须正常工作。

用 C 语言解析网络数据包哪种方法更好?

在通过方法 2 解析数据包时,结构填充和对齐是否有任何区别?如果是,Linux 头文件是如何解决这个问题的?

【问题讨论】:

  • 所有编译器都具有不填充结构或对齐成员字段的功能,您还可以将位字段用于短一个字节的字段。
  • @JoachimPileborg - 哪种方法更好、便携且高效?
  • 可在编译器、操作系统、硬件或它们的组合之间移植?效率更高,速度更快,使用更少的内存,还是其他一些标准?这两种方法都有优点,哪一种“最好”取决于你的目标。
  • 我正在尝试编写一个协议栈,它可以移植到不同类型的操作系统(例如 Linux、qnx、vxworks),因此必须跨操作系统和编译器进行移植。根据上述描述,您有什么建议?

标签: c network-programming


【解决方案1】:

方法 1 最适合可移植性。例如,它允许您安全地避免未对齐的访问。特别是,如果您的机器是 little-endian,这种方法可以让您非常轻松地处理字节交换。

方法 2 有时很方便,而且通常可以更快地编写代码。如果结构填充妨碍您,您的编译器可能会提供一个标志或属性(如__attribute__((__packed__))#pragma pack)来解决它。但是,如果您有一台 little-endian 机器,您仍然需要在所有地方进行字节交换字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    相关资源
    最近更新 更多