socket编程为什么需要htons(), ntohl(), ntohs(),htons() 函数
欢迎访问我的最新博客:https://blog.fanscore.cn在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): ? ? 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://blog.chinaunix.net/uid-21278406-id-444362.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |