puppy居
puppy居士
posts - 41,comments - 27,trackbacks - 0
      被阴了一把.
      做M2M终端协议的时候,报文封装都是按照little-endian来处理的。与服务器那边却总是连不上,后来把数据发过去核对,才发现服务器那边只认big-endian,即所谓的网络序。问题是协议里面并没有明确说明要这样做,没办法,只好再花时间加上htons、ntohs。
      在网络上发送数据之前,一般的做法的确是要转换成网络顺序发送。下次在做网络协议时一定要事先弄清楚,切记!

为了保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。

为了进行转换 bsd socket提供了转换的函数 有下面四个:
 (s -- short    l -- long    h -- host   n -- network)
htons 
unsigned short类型从主机序转换到网络序
htonl 
unsigned long类型从主机序转换到网络序
ntohs 
unsigned short类型从网络序转换到主机序
ntohl 
unsigned long类型从网络序转换到主机序

在使用little endian的系统中 这些函数会把字节序进行转换 
在使用big endian类型的系统中 这些函数会定义成空宏
同样 在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug.


不同的CPU上运行不同的操作系统,字节序也是不同的,参见下表。
处理器    操作系统    字节排序
Alpha    
全部    Little endian
HP-PA    NT    Little endian
HP-PA    UNIX    Big endian
Intelx86    
全部    Little endian <-----x86系统是小端字节序系统
Motorola680x()    
全部    Big endian
MIPS    NT    Little endian
MIPS    UNIX    Big endian
PowerPC    NT    Little endian
PowerPC    
NT    Big endian  <-----PPC系统是大端字节序系统
RS/6000    UNIX    Big endian
SPARC    UNIX    Big endian
ARM
    全部    Little endian 
posted on 2008-08-27 15:07 puppy 阅读(577) 评论(0)  编辑 收藏 引用 所属分类: 杂项
只有注册用户登录后才能发表评论。