欢迎使用CSDN-markdown编辑器

http://www.360doc.com/content/12/0222/10/54470_188560773.shtml
在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题。
这时就可能用到htons(), ntohl(), ntohs(),htons()这4个网络字节顺序与本地字节顺序之间的转换函数:

      htonl()--"Host to Network Long int"     32Bytes
      ntohl()--"Network to Host Long int"     32Bytes
      htons()--"Host to Network Short int"   16Bytes
      ntohs()--"Network to Host Short int"   16Bytes

之所以需要这些函数是因为计算机数据表示存在两种字节顺序:NBO与HBO。

网络字节顺序NBO(Network Byte Order):
按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。

主机字节顺序(HBO,Host Byte Order):
不同的机器HBO不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。
如 Intel x86结构下,short型数0x1234表示为34 12, int型数0x12345678表示为78 56 34 12 。
如IBM power PC结构下,short型数0x1234表示为12 34, int型数0x12345678表示为12 34 56 78。

由于这个原因不同体系结构的机器之间无法通信,所以要转换成一种约定的数序,也就是网络字节顺序,其实就是如同power pc那样的顺序 。在PC开发中有ntohl和htonl函数可以用来进行网络字节和主机字节的转换。

在Linux系统下:htonl(),htons(), ntohl(), ntohs()的头文件及函数定义:
  #include

include

include

include

include

include

int main(int argc, char* argv[])
{
struct in_addr addr1,addr2;
ulong l1,l2;
l1= inet_addr(“192.168.0.74”);
l2 = inet_addr(“211.100.21.179”);
memcpy(&addr1, &l1, 4);
memcpy(&addr2, &l2, 4);

     printf("%s : %s ", inet_ntoa(addr1), inet_ntoa(addr2));    //注意这一句的运行结果

     printf("%s ", inet_ntoa(addr1));
     printf("%s ", inet_ntoa(addr2));
     return 0;

}
实际运行结果如下:
192.168.0.74 : 192.168.0.74 //从这里可以看出,printf里的inet_ntoa只运行了一次。
192.168.0.74
211.100.21.179

inet_ntoa返回一个char ,而这个char 的空间是在inet_ntoa里面静态分配的,所以inet_ntoa后面的调用会覆盖上一次的调用。第一句printf的结果只能说明在printf里面的可变参数的求值是从右到左的,仅此而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值