为什么发送§接受数据的时候不考虑网络字节序的问题?

jingyueid 2005-12-29 11:32:15
如题,甚感困惑。

socket 在 bind 到端口的时候,甚至都会把端口数值用htons()设置为网络字节序。
而在进行write和read操作的时候,肯本却不考虑网络自己序的问题,为什么??


端口数值设置为网络字节序,我可以理解为ip封装的需要,write和read为什么没有进行网络字节排序?

在线等。
...全文
209 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fierygnu 2005-12-29
  • 打赏
  • 举报
回复
write和read也要考虑字长、字节序的问题,但是需要程序员自己考虑,socket接口不处理。
lcl118 2005-12-29
  • 打赏
  • 举报
回复
嘿嘿,感觉说的有点过。
我想说, moto的cpu也可能是用 little-endian, 这样,就不需要转换。
建议 使用 htonl/ntohl系列函数 书写字节序无关代码。
lcl118 2005-12-29
  • 打赏
  • 举报
回复
提醒楼主一下:
定义big-endian和little-endian是为了满足不同CPU架构对bit流的处理差别。反映到代码级别上,是 当cpu存储 某种类型 的数据(如int,long,struct) 到memory上的时候,数据的最低位在低地址还是高地址;读取的时候(即将连续的数据转换为类型的时候),将低地址看成该数据的高位还是地位。

所以,“server如果是moto的unix,而client是ia32的windows的话?
在C编码级上,不得不需要把所传输的结构内的int,long都修改为网络字节序,而客户端也不的不把网路字节序修改为本地字节序,就像对port所做的操作一样。”
中,将 字节序 跟 操作系统 挂钩,很危险哦
fierygnu 2005-12-29
  • 打赏
  • 举报
回复
对。read和write面向的是字节流,不能对内容做假设,所以不能做字节序转换,因此要应用自己处理。
jingyueid 2005-12-29
  • 打赏
  • 举报
回复
这种应用应该是不考虑平台的。

server如果是moto的unix,而client是ia32的windows的话?
在C编码级上,不得不需要把所传输的结构内的int,long都修改为网络字节序,而客户端也不的不把网路字节序修改为本地字节序,就像对port所做的操作一样。

我认为应该要这样做才对。
fierygnu 2005-12-29
  • 打赏
  • 举报
回复
发送和接收方要约定的,这就是应用协议的一部分。

就象你说,收到的是字节流,字节流的内容是需要应用解析的,应用知道字节流使用的字节序(应用协议规定的)。
jingyueid 2005-12-29
  • 打赏
  • 举报
回复
假设结构
struct sample_type{
int _val1;
long _val2;
char _val3;
};

struct sample_type a;
a._val1 = 1;
a._val2 = 3L;
a._val3 = \'a\';
write( socket_descriptor, &a, sizeof(a) ) /* 接受方收到的是个字节流,
big endian和little endian所产生的结构体根本就不一样,那么怎么办??? */
...


read和write把所操作的buffer做为一个字节流来对待,根本就忽略了buffer所指向的数据结构,如何能完成 网络字节序 转换?????
--------------
best regards

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧