在 C/C++ 写网络程序的时候, 往往会遇到字节的网络顺序和主机顺序的问题. 这是就可能用到 htons(), ntohl(), ntohs(),htons()这 4 个函数.
网络字节顺序与本地字节顺序之间的转换函数:
- htonl()--"Host to Network Long"
- ntohl()--"Network to Host Long"
- htons()--"Host to Network Short"
- ntohs()--"Network to Host Short"
之所以需要这些函数是因为计算机数据表示存在两种字节顺序: NBO 与 HBO
网络字节顺序 NBO(Network Byte Order):
按从高到低的顺序存储, 在网络上使用统一的网络字节顺序, 可以避免兼容性问题.
主机字节顺序(HBO,Host Byte Order):
不同的机器 HBO 不相同, 与 CPU 设计有关, 数据的顺序是由 cpu 决定的, 而与操作系统无关.
如 Intelx86 结构下, short 型数 0x1234 表示为 34 12, int 型数 0x12345678 表示为 78 56 34 12 如 IBM power PC 结构下, short 型数 0x1234 表示为 12 34, int 型数 0x12345678 表示为 12 34 56 78
由于这个原因不同体系结构的机器之间无法通信, 所以要转换成一种约定的数序, 也就是网络字节顺序, 其实就是如同 powerpc 那样的顺序 . 在 PC 开发中有 ntohl 和 htonl 函数可以用来进行网络字节和主机字节的转换.
2.
在 Linux 和 Windows 网络编程时需要用到 htons 和 htonl 函数, 用来将主机字节顺序转换为网络字节顺序.
在 Intel 机器下, 执行以下程序
- int main()
- {
- printf("%d \n",htons(16));
- return 0;
- }
得到的结果是 4096, 初一看感觉很怪.
解释如下, 数字 16 的 16 进制表示为 0x0010, 数字 4096 的 16 进制表示为 0x1000. 由于 Intel 机器是小尾端, 存储数字 16 时实际顺序为 1000, 存储 4096 时实际顺序为 0010. 因此在发送网络包时为了报文中数据为 0010, 需要 经过 htons 进行字节转换. 如果用 IBM 等大尾端机器, 则没有这种字节顺序转换, 但为了程序的可移植性, 也最好用这个函数.
另外用注意, 数字所占位数小于或等于一个字节 (8 bits) 时, 不要用 htons 转换. 这是因为对于主机来说, 大小尾端的最小单位为字节(byte).
包含的头文件为:"winsock2.h"
来源: http://www.bubuko.com/infodetail-2671335.html