Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中解析网络数据包的正确方法_C_Network Programming - Fatal编程技术网

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

C语言中解析网络数据包的正确方法,c,network-programming,C,Network Programming,(如果我不能正确回答问题,请原谅。英语不是我的母语。) 我正在尝试解析SyncE ESMC数据包。它是以太网慢速协议包 方法1: 为了解析这个数据包,我使用了与已经完成的类似的逐字节方法 方法2: 解析数据包的另一种方法是定义一个“结构”来表示整个数据包,并访问各个字段以检索特定偏移量处的值。 然而,在这种方法中,可能会出现结构填充和对齐(我不确定),但在Linux上,各种数据包头是以结构的形式定义的,例如ip.h中的iphdr。IP数据包(缓冲区)可以类型转换为“iphdr”以检索IP头字段,

(如果我不能正确回答问题,请原谅。英语不是我的母语。)

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

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

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

用C解析网络数据包,哪种方法更好


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

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


方法2有时很方便,而且通常编写代码的速度更快。如果结构填充妨碍了您的工作,那么编译器可能会提供一个标志或属性(如
\uuuuuu attribute\uuuuuuuu((\uuuu packed\uuuuuuu))
\pragma pack
)来解决这个问题。但是,如果你有一台小小的endian机器,你仍然需要到处使用byteswap字段。

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