我刚开始在C ++中进行一些原始网络编程,并且一直在树莓派上编译(没有交叉编译)。这使得一切都是小端。
在构建IP头之后,我计算了IP校验和,但结果总是不正确(基于此处的示例 http://www.thegeekstuff.com/2012/05/ip-header-checksum/)。
通过使用gdb,我将我的问题定位到了IP头中前32位的顺序。该示例使用0x4500003C
,这意味着版本为4(0x4
),IHL为5(0x5
),TOS为0(0x00
),tot_length为60(0x003C
)。所以我设置了相同的数据包。
struct iphdr* ip; // Also some mallocing
ip->version = 4;
ip->ihl = 5;
ip->tos = 0;
ip->tot_len = 60;
现在在gdb中,我检查了前32位,期望得到0x3C000045
因为字节序,但实际上我得到了这个:
(gdb) print ip
$1 = (iphdr *) 0x11018
(gdb) x/1xw 0x11018
0x11018: 0x003c0045
前16位是小端序(0x0045
),但第二个包含十进制60的部分似乎是大端序(0x003C
)!
这是怎么回事?是我疯了吗?我对结构体内部的字节顺序完全错了吗?(这是一种明确的可能性)