关于网络字节顺序的问题

xiao_potato 2003-11-09 01:44:35
msdn中曰:
u_short ntohs(
u_short netshort
);

The ntohs function returns the value in host byte order. If the netshort parameter was already in host byte order, then no operation is performed.

纳闷:ntohs如何知道netshort是不是HBO?


顺便帮我看看我的理解对不对:

网络上传输本无高位字节低位字节优先的问题,网络发送时是按照内存中的顺序发送的。只是在在终端接收时,认为先接收到高位,再接收到低位。在接收端,如果不是接收链路层数据,根本不用去考虑网络字节顺序。可以认为从recv接收到缓冲区的字符就是发送端的字符,并按照先后到达顺序存放。如果用一个int行指针去访问缓冲区,那么读出来的数就与平台的存储字节顺序有关了。所以如果平台相同,应用层数据(就是不包括协议头)要么都进行转换,如发端htonl(),收端ntohl(),要么不进行转换,但如果一端转换,另一端不转换,在windows平台下是要出错的。但是协议头,我想还是要进行转换的,因为TCP/IP协议内核程序肯定是认为你按照台big-endian来发送的。所以不管是协议头还是应用层数据,如果是16位或者是32以上类型的数据,最好一概进行转换,虽然在发送时,都是从char*形缓冲区中按字节发送的。


再回到,ntohs如何知道netshort是不是HBO这个问题。好象又有点明白了。

如果netshort是从网络上来的原始数据,即不是其他地方定义的或是经过修改的网络数据。一概认为是按照网络字节存放big-endian,然后判断主机是什么字节顺序,如果也是big-endian,则不进行任何操作,如果是litter-endian,则进行转换。所以ntohs有没有实际进行转换完全依赖主机的字节顺序,msdn的表达不太确切。


有点罗嗦,如果我说的没错,一个上午的时间总算有点收获。不然,郁闷死了
...全文
122 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hafent 2003-11-20
  • 打赏
  • 举报
回复
嗯,学习中
sevencat 2003-11-09
  • 打赏
  • 举报
回复
链接器会知道这个的。一般在头文件中会有这个大端小端的定义的。
这个函数有的情况下什么事情也不做。
xiao_potato 2003-11-09
  • 打赏
  • 举报
回复
TO huanyun:都五个三角了,还“呵呵 学习”,也不说点具体的。不像话

TO ablefist:你说的我明白,问题是,你什么时候会下命令__必须按照 NBO 顺序。此时还有两种情况1:不听话就拉出去毖了,那我不得不听;2:不听话你也就睁以只眼闭一只眼,不影响大局,那我就看个人习惯了。可否举个例子?
ablefirst 2003-11-09
  • 打赏
  • 举报
回复
注意这样的事实:有两种字节排列顺序:重要的字节 (有时叫 "octet",即八 位位组) 在前面,或者不重要的字节在前面。前一种叫“网络字节顺序 (Network Byte Order)”。有些机器在内部是按照这个顺序储存数据,而另外一些则不然。当我说某数据必须按照 NBO 顺序,那么你要调用函数(例如 htons() )来将它从本机字节顺序 (Host Byte Order) 转换过来。如果我没有提到 NBO,那么就让它保持本机字节顺序。

希望这些对你有帮助,祝你成功!
huanyun 2003-11-09
  • 打赏
  • 举报
回复
呵呵 学习

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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