(对不起,如果我无法正确提出问题。英语不是我的主要语言。)
我正在尝试解析SyncE ESMC数据包。它是以太网慢速协议包。
方法1: 为了解析这个数据包,我使用逐字节方法,类似于已完成的here。
方法2: 解析数据包的其他方法是定义一个'结构'来表示整个数据包,并访问各个字段以检索特定偏移量的值。 然而,在这种方法中,结构填充和对齐可能会出现(我不确定),但在Linux上,各种数据包标题以结构的形式定义,例如, iphdr在ip.h中。 IP数据包(缓冲区)可以类型转换为'iphdr'以检索ip头字段,因此它必须正常工作。
哪种方法最好用C解析网络数据包?
通过方法2解析数据包时,结构填充和对齐是否有任何区别?如果是的话,Linux标头是如何克服这个问题的呢?
答案 0 :(得分:1)
方法1是最便携的。例如,它允许您安全地避免错位访问。特别是,如果你的机器是little-endian,这种方法可以让你很容易地处理字节交换。
方法2有时很方便,而且编写代码通常更快。如果结构填充阻碍了你,你的编译器可能会提供一个标志或属性(如__attribute__((__packed__))
或#pragma pack
)来解决它。但是,如果你有一台小端机器,你仍然需要在整个地方使用字节交换字段。