在C语言中解析网络数据包的正确方法

6

如果我没有正确提出问题,请原谅。英语不是我的母语。

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

方法1: 为了解析此数据包,我使用了逐字节的方法,类似于此处所做的方法。

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

在C中解析网络数据包哪种方法更好?

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


所有编译器都具有不填充结构或对齐成员字段的功能,您还可以使用位域来表示比一个字节短的字段。 - Some programmer dude
@JoachimPileborg - 哪种方法更好、可移植和高效? - Abhirav
可移植性指代码能否在不同的编译器、操作系统、硬件或其组合之间进行移植。而更高效则是指代码是否更快、占用更少的内存或其他标准。这两种方法都有其优点,哪一种“最好”取决于您的目标。 - Some programmer dude
我正在尝试编写一个协议栈,它可以移植到不同类型的操作系统(如Linux、qnx、vxworks),因此在不同的操作系统和编译器之间必须具有可移植性。基于上述描述,你有什么建议? - Abhirav
1个回答

1

方法1最适合可移植性。例如,它允许您安全地避免错误对齐访问。特别是,如果您的计算机是小端序,这种方法可以让您非常轻松地处理字节交换。

方法2有时很方便,通常编写速度更快。如果结构填充妨碍了您的工作,您的编译器可能会提供一个标志或属性(如__attribute__((__packed__))#pragma pack)来解决它。但是,如果您拥有小端序计算机,则仍然需要在各个字段中进行字节交换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接