网络字节顺序和本机字节顺序小谈

  • 字节顺序定义     

字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。(一个字节的数据当然就无需谈顺序的问题)。

在大部分的开发中我们不需要考虑字节序的问题。唯有在跨平台以及网络程序应用中字节序才是一个应该被考虑的问题。


  • 网络应用的字节序

网络字节序是TCP/IP规定好的一种数据表示格式,它与具体的CPU类型、操作系统无关,从而可以保证数据在不同主机之间传输时能被正确解释。网络字节顺序采用big endian排序方式。

在网络编程时,并不是什么时候都要考虑字节序问题。那么什么时候需要考虑呢?
Intel CPU使用的都是little endian。
实际上如果是应用层的数据,即对TCP/IP来说是透明的数据,不用考虑字节序的问题。因为接收端收到的顺序是和发送端一致的。


基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的。因而对int、uint16、uint32等多于1字节类型的数据,在这些嵌入式平台上应该变换其存储顺序。通常我们认为,网络字节序为标准顺序,考虑到与协议的一致以及与同类其它平台产品的互通,在程序中发数据包时,将主机字节序转换为网络字节序,收数据包处将网络字节序转换为主机字节序。


下面以一个实际的例子来说明主机字节序和网络字节序的区别:

        unsigned short port = 0x0018;
	SOCKADDR_IN sodkaddr;
	LPVOID ja=  &sodkaddr;
	sodkaddr.sin_port = port;
	sodkaddr.sin_port = htons(port);

能够看到程序在执行完:
sodkaddr.sin_port = port;
时,内存中的数据是如下图形式:

0x0018FB98  cc cc 18 00 cc cc

而网络字节序是大端形式,即高位存储在内存低地址,则在创建端口时其读取的数据为 : 0x1800,这与我们预期的肯定不一致,因此如果不使用相应的转换函数先行转换的话,后期会发生无法预料的错误。

当我们继续往下执行完这句时:

sodkaddr.sin_port = htons(port);

内存中的数据如下图所示:

0x0018FB98  cc cc 00 18 cc

此时若创建端口,则其读取的数据为:0x0018,与我们预期的设计一致。


  • 字节序转换函数

htons 把 unsigned short 类型从主机序转换到网络序
htonl 把 unsigned long 类型从主机序转换到网络序
ntohs 把 unsigned short 类型从网络序转换到主机序
ntohl 把 unsigned long 类型从网络序转换到主机序

上面这几个函数可以按照这样的方式记忆,例如:htons函数,则代表 host to network,s 代表 unsigned short


char FAR * inet_ntoa( struct in_addr in);
将一个IP转换成一个互联网标准点分格式的字符串。
in_addr_t inet_addr(const char *cp);
将一个点分十进制的IP转换成一个长整数型数(u_long类型)。返回值即为网络字节顺序,可以直接作为internet 地址

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
char recvBuf[100];
char tempBuf[100];
sprintf(tempBuf,"%s say: %s",inet_ntoa(addrSrv.sin_addr),recvBuf);

inet_ntoa(addrSrv.sin_addr)将sin_addr储存的IP(数值)转换成字符串形式(127.0.0.1)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值