c – Raspberry Pi上的endianess问题
我刚开始使用C语言进行一些原始网络编程,并且已经在我的Raspberry Pi上编译(没有交叉编译).这使得一切都变成了小尾数.
在构建我的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)! 是什么给这个?我疯了吗?我对结构体内的字节顺序完全错了吗? (这是一个明确的可能性) 解决方法
结构中的字段顺序,然后是多字节字段中的字节顺序.
0x003C根本不是字节序,它是60的十六进制值.当然,它以一些字节顺序存储在内存中,但是你用来写字段的顺序和用来读取它的顺序是相同的 – 两者都是是Raspberry Pi的本机字节顺序,它们取消了. 通常你会想写: ip->tot_len = htons(60); 将16位字段存储到数据包中时.还有用于32位字段的htonl,以及用于从网络数据包读取字段的ntoh和ntohl. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- VB.Net之旅--.Net多语言运行库的基础
- ruby-on-rails – cancancan authorize_resource无法按预期
- c# – Asp.Net MVC 3动态属性的编辑器
- QT5:C++实现基于multimedia的音乐播放器(二)
- Oracle 11g系列:数据表对象
- Ajax XMLHttpRequest对象的三个属性以及open和send方法
- Swift 3:如何缩放和旋转UIImageView?
- ruby-on-rails – 在所有rails帮助程序中将协议更改为https
- c# – azure webjob因未处理的异常而停止:503服务器不可用
- c – 为什么std :: atomic_ {char,schar等等} typedefs被允