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

时间:2013-01-31 19:54:42

标签: c network-programming

(对不起,如果我无法正确提出问题。英语不是我的主要语言。)

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

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

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

哪种方法最好用C解析网络数据包?

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

1 个答案:

答案 0 :(得分:1)

方法1是最便携的。例如,它允许您安全地避免错位访问。特别是,如果你的机器是little-endian,这种方法可以让你很容易地处理字节交换。

方法2有时很方便,而且编写代码通常更快。如果结构填充阻碍了你,你的编译器可能会提供一个标志或属性(如__attribute__((__packed__))#pragma pack)来解决它。但是,如果你有一台小端机器,你仍然需要在整个地方使用字节交换字段。