标签:
其实,不止是ip和port需要转换成网络字节序,如果发送端和接收端字节序不一样,有些情况下也要转换。
参考unix网络编程卷1的5.18节,下面贴几张图
以下文字复制自论大小端
对于跨平台的程序或者所用数据牵扯到不同平台的程序(例如网络编程),大小端字节序是个值得考虑的事情。本文主要讨论一下网络编程方面的大小端问题。(by peakflys)
先来说一下几个定义:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。(逻辑上的低低高高)
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。(像数据流一样填充)
c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。
因为字节序往往和具体CPU架构有关,所以 如果你知道你的程序主要用户群是什么平台,为了方便或者效率,你可以除了socket端口等需要在主机字节序和网络字节序之间转换外,其余数据的传递直接无视。例如 现在很多端游 都是如此。因为现在大多数人使用的计算机都是X86体系结构的CPU+Windows操作系统,这部分用户基本就是主流玩家,其他平台的玩家,除非获得的回报率足够多,否则没必要花费太多时间关注。
先来说一下,常见的CPU架构的字节序吧:
Big Endian : PowerPC、IBM、Sun
Little Endian : x86、DEC
ARM的大小端是可选的。
最近随着移动终端(大多为ARM处理器)和移动互联网的爆发式发展,以后的游戏平台就不得不考虑一下大小端问题了。
大小端问题主要涉及的是非单字节非字符串外的其余数据的表示和传递,如short型、int型等。判断主机大小端的方法有很多,常见的是联合体判断法,代码如下:
以下内容为自己总结:(协议部分都是大端,应用可以自己定 )
1、编程时,ip和port需要转换成网络字节序,这是网络协议的规定,注意,ip和port并不是到达应用层数据的一部分,而是网络层和传输层头部的一部分,是属于协议的一部分协议;
2、我们发送的数据是真正从发送端的应用层传输到接收端的应用层的数据,如果发送端和接收端字节序不一样,那么就要考虑字节转换。其根本是:网络传输不一定要统一大端,小端也可以,只要保证2端一致就行了。因为服务器负担大,这些工作就由客户端去做,可以有以下两种方式:1)编程之前,用文档约束好,服务器采用的是大端或者小端,然后客户端根据自己的大小端情况去转换成与服务器一样的字节序再发送和接受;2)客户端连接服务器后,服务器先发送一个表示大小端的1字节的数据到客户端,客户端接收后得知服务器的大小端,以后发送和接收数据时作大小端的调整再发送和接收。
标签:
原文地址:http://blog.csdn.net/u013281495/article/details/51166210