免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7806 | 回复: 15
打印 上一主题 下一主题

[C] 关于网络字节序的问题 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-28 22:07 |只看该作者 |倒序浏览
问题是这样的,假设有一个10进制数10055,16进制表达式是0x2747,那我发送出去,先发送低字节(0x47),然后发送高字节(0x20),还是相反???
或者根本 不是高低字节的问题,而是先发送内存低地址,然后发送内存高地址,或者先发送内存高地址,再发送内存低地址。如果和内存地址相关的话,就得考虑大端小端的问题了。

这个问题一直很疑惑。

之所以问这个问题,因为今天在解析报文的时候,报文head中有字段指示了其后面数据的长度,我想需要获得长度值。
两个协议,解析方法不同,一种是:data[0]<<8 | data[1] 来获得,另一种是:data[1]<<8 | data[0] 的方法来获得。所以和协议有关?
那我发送纯数据有怎么样,我本地主机定义字符串“abcdefg”,网络主机先收到a,还是g?

论坛徽章:
4
摩羯座
日期:2013-11-24 21:55:03天秤座
日期:2013-11-25 20:54:14酉鸡
日期:2013-11-26 22:08:11天蝎座
日期:2013-12-07 07:32:45
2 [报告]
发表于 2013-11-28 22:13 |只看该作者
本帖最后由 _BlueGuy__ 于 2013-11-28 22:33 编辑

一看就知道你们的服务器是用JAVA写的,怎么还有报文一说?

那要看你的服务器和客户端 主机字节序 是不是一致
网络字节序问题主要是 同步 客户端和服务器 字节序的

你基础太差了,字节序跟接收顺序没关系的,而且 字符串是单字节的,不需要关心字节序问题

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
3 [报告]
发表于 2013-11-28 23:21 |只看该作者
对于16bit short型整数,查看htons()和ntohs()两个函数。

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
4 [报告]
发表于 2013-11-29 09:24 |只看该作者
网络传输习惯用网络字节序,也就是大端字节序,而且字节序只影响多字节数据,不会影响单字节数据。但是你完全不考虑字节序的问题的话,只要发送端和接收端字节序一致就不会有问题。但是你给出的data[0]<<8 | data[1]这种写法是假定收到的是大端字节序的十六位数据而data[1]<<8 | data[0] 这种写法假定的是小端。(希望我没把大小端搞反)

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
5 [报告]
发表于 2013-11-29 09:51 |只看该作者
你说的那个指明长度的东西,肯定是和协议有关;而且大小端的问题,只是影响整型数而已,字符串怎么可能有影响?
当然你也可以故意倒着发,收到的时候再把它倒回来,前提是你吃饱了撑着

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2013-11-29 14:56 |只看该作者
在做http审计。和服务器类型无关。
假设发送端口不采取调制,硬件那必定是0,1为数据单元发送的,比如我在应用层要发送数字1005,有两个问题。
问题1:把一个字节当成一个单元看,硬件是先发0x27,还是0x47。
问题2:如果深入到一个字节来看,发送0x27,也就是00100111,那硬件是先发送0,还是1。
一共2个问题,不知道您能不能回答。

如果调制的话,fsk,ask,psk,qam,多了,这个先不考虑,假设数据流已经经过了解调器。
回复 2# _BlueGuy__


   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2013-11-29 15:06 |只看该作者
skb->data 中,data 是unsigned char * 的指针。

比如我发现在本地主机http 请求中,前3个字节就表明了后续的数据大小。在本机抓包后,发现 数据长度是00000000 00001000 00000001。


那我接收方中skb->data 中,data[0],data[1],data[2]  就是代表了那个长度值。

现在有可能
00000001 00001000 00000000  这么到来

也有可能这么到来
00000000 00001000 00000001

我如何判断是怎么到来的,是和大小端有关系吗?
(我现在处于tcp层)
回复 5# w_anthony


   

论坛徽章:
0
8 [报告]
发表于 2013-11-29 15:37 |只看该作者
回复 7# mrpre


你就认为是网络序,什么端不得转成网络序发送

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
9 [报告]
发表于 2013-11-29 15:39 |只看该作者
你只是没理解字节序。

论坛徽章:
7
摩羯座
日期:2013-12-05 10:42:57辰龙
日期:2013-12-27 13:40:49亥猪
日期:2014-01-15 09:10:37天秤座
日期:2014-01-20 11:22:20辰龙
日期:2014-01-26 17:02:25午马
日期:2014-01-27 14:22:34水瓶座
日期:2014-02-19 09:36:40
10 [报告]
发表于 2013-11-29 16:26 |只看该作者
首先要理解主机序、网络序。
网络序可以理解为大端,大部分操作系统的主机序是小端的,但是也有个别系统是大端的。貌似freebsd就是大端,忘了,不要纠结这个。

linux在发送结构体的时候一定还要注意”结构体对齐“问题。否则有可能出问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP