Linux网络通信----htonl()、htons()、ntohl()、ntohs()四个函数
转载:https://blog.csdn.net/miao19920101/article/details/69398158
前言:
今天在工作中用到htonl()这个函数,不是很理解,查阅资料之后随笔就记录下来,方便以后工作和学习翻阅。
首先需要说明的是这四个函数的头文件都需要头文件:
#include <arpa/inet.h>
- 1
htonl()函数
函数原型是:uint32_t htonl(uint32_t hostlong)
其中,hostlong是主机字节顺序表达的32位数,htonl中的h–host主机地址,to–to,n–net网络,l–unsigned long无符号的长整型(32位的系统是4字节);
函数返回值是一个32位的网络字节顺序;
函数的作用是将一个32位数从主机字节顺序转换成网络字节顺序。
htons()函数
函数原型是:uint16_t htons(uint16_t hostlong)
其中,hostlong是主机字节顺序表达的16位数,htons中的h–host主机地址,to–to,n–net网络,s–signed long无符号的短整型(32位的系统是2字节);
函数返回值是一个16位的网络字节顺序;
函数的作用是将一个16位数从主机字节顺序转换成网络字节顺序,简单的说就是把一个16位数高低位呼唤。
ntohs()函数
函数原型是:uint16_t ntohs(uint16_t hostlong)
其中,hostlong是网络字节顺序表达的16位数,ntohs中的,n–net网络,to–toh–host主机地址,s–signed long有符号的短整型(32位的系统是2字节);
函数返回值是一个16位的主机字节顺序;
函数的作用是将一个16位数由网络字节顺序转换为主机字节顺序,简单的说就是把一个16位数高低位互换。
ntohl()函数
函数原型是:uint32_t ntohs(uint32_t hostlong)
其中,hostlong是网络字节顺序表达的32位数,ntohs中的,n–net网络,to–toh–host主机地址,s–unsigned long无符号的短整型(32位的系统是4字节);
函数返回值是一个32位的主机字节顺序;
函数的作用是将一个32位数由网络字节顺序转换为主机字节顺序。
这些函数存在的意义
为什么存在这个函数呢?或者存在这个函数的意义?
说到这部分需要引入字节存放的两个概念一个是“大端顺序”,一个是“小端顺序”。俗称“小尾顺序”、“大尾顺序”。
简单的说就是对应数据的高字节存放在低地址,低字节存放在高地址上就是大端顺序,对应数据的高字节存放在高地址,低字节存放在低地址上就是小端顺序。
比如 unsigned long hostlong = 0xa2b4c6d8;
大端顺序存放:
偏移地址 存放内容
0x00000000 0xa2
0x00000001 0xb4
0x00000002 0xc6
0x00000003 0xd8
小端顺序存放:
偏移地址 存放内容
0x00000000 0xd8
0x00000001 0xc6
0x00000002 0xb4
0x00000003 0xa2
同理推理16位数以及64位数。
一般地,在我的编译器里面设置的是小端顺序,这个可以根据自己的编译器看下设置,这里不深入说明。但是网络传输数据采用的是大端顺序。所以这才涉及到主机字节顺序和网络字节顺序,再说的详细一点,主机字节顺序可能是大端顺序或者小端顺序(这个要看编译器的设置,还有自己是用的C还是Java还是其他的语言,其各自都是不尽相同),但是网络字节顺序一定是大端顺序。
多说几句
为什么会有这个大端模式和小端模式呢?
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于 大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以随时在程序中(在ARM Cortex 系列使用REV、REV16、REVSH指令[1] )进行大小端的切换。
Linux网络通信----htonl()、htons()、ntohl()、ntohs()四个函数相关推荐
- Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa)
Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa) htonl() htons() ntohl() ntohs()及inet_n ...
- htonl,htons,ntohl,ntohs的详解
大小端模式 对于多字节的数值在系统中如何存储取决于各CPU的实现,而高字节部分是存在低地址还是高地址就有不一样的结果了,因此才有大小端两种模式的存在,而命名则是根据起始地址存放的是数值字节的低处还是高 ...
- htonl htons ntohl ntohs inet_pton inet_ntop
字节序转换函数 uint32_t htonl(uint32_t hostlong)主机字节序到网络字节序长整型转换 uint32_t htons(uint16_t hostshort)主机字节序到网络 ...
- htons() ntohl() ntohs() htons()的区别及详解
在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题. 这时就可能用到htons(), ntohl(), ntohs(),htons()这4个网络字节顺序与本地字节顺序之间的转换函数 ...
- htons(), ntohl(), ntohs(),htons()这4个函数
在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数. 网络字节顺序与本地字节顺序之间的转 ...
- linux函数库之htons(), ntohl(), ntohs(),htons() 函数
字节序分为大端字节序和小端字节序: 大端字节序: 是指一个整数的高位字节(32-31bit)存储在内存的低地址处,低位字节(0-7bit)存储在内存的高地址处. 小端字节序: 是指一个整数的高位字节( ...
- socket编程为什么需要htons(), ntohl(), ntohs(),htons() 函数
在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数. 网络字节顺序与本地字节顺序之间的转 ...
- 为什么需要htons(), ntohl(), ntohs(),htons() 函数
为什么需要htons(), ntohl(), ntohs(),htons() 函数: 在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl ...
- htons java_socket编程为什么需要htons(), ntohl(), ntohs(),htons() 函数
在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数. 网络字节顺序与本地字节顺序之间的转 ...
- 网络字节与主机字节转换 htons(), ntohl(), ntohs(),htons() 函数
在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数. 网络字节顺序与本地字节顺序之间的转 ...
最新文章
- A 'return' expression required in a function with a block body ('{...}')
- kali 设置中文字体
- ubuntu18.04(bionic) 配置阿里数据源
- jzoj4815-ksum【堆】
- HDU2066:一个人的旅行
- React开发(138):ant design学习指南之anchor处理
- 【Python基础入门系列】第09天:Python tuple
- 归档和解档-Archiver
- MyBatis第1天
- Flex一个RemoteObject调用JAVA对象里面的多个方法
- 在软件测试中UT,IT,ST,UAT分别是什么意思
- 针对中东石油能源工业控制系统的又一网军诞生
- xen html插件天气不会刷新,天气通刷新不了怎么办 刷新不了解决方法
- 学习笔记10--多传感器融合定位技术
- ios 网速监控_IOS_网速流量实时监控
- 陶哲轩实分析定理 11.4.3 $\max$与$\min$保持黎曼可积性
- turtle库画图单击鼠标获取坐标位置
- Python中的os.chdir()函数:改变当前工作目录
- 培训官赵敏:学员就是我们的产品[摘自上海科技报]
- 每天一个小技巧【5】·数位板笔刷压感设置
热门文章
- dreamweaver半角空格_Dreamweaver常见问题解答
- iterm2 字体颜色
- 各浏览器的用户代理字符串整理
- WTL_Freecell v1.2 (WTL空当接龙v1.2) 20180112
- java获取专辑封面_android获取音乐文件的内置专辑图片实现思路及代码
- 新晋 CTO 的工作总结:我在第一年学到了 14 个经验教训
- 五个不用本人出镜拍摄的短视频领域,要选择适合自己的,抓紧收藏
- 币氪研报l Gxshare(GXS)
- 嵌入式开发学习的几种线路图方向
- 虚拟机设置固定ip地址