htons ntoh inet_addr inet_aton inet_ntoa 字节序转换函数
在主机内存中,数据的保存方式是不同的,主要的保存数据的方式有两种,
- 大端字节序:即高位字节存放低位地址
- 小端字节序:即高位字节存放高位地址
在TCP/IP协议中规定,网络字节序统一为大端序
htons()、ntohs()、htonl()、ntohl()
首先,最基本的字节序转换函数如下:
1 1 unsigned short htons(unsigned short); 2 2 unsigned short ntohs(unsigned short); 3 3 unsigned long htonl(unsigned long); 4 4 unsigned long ntohl(unsigned long);
- htons中的h代表主机字节序,可以解释为“将short型数据从主机字节序转化为网络字节序”
- htons中的n代表网络字节序,可以解释为“将short型数据从网络字节序转化为主机字节序”
- s代表2字节short,因此可以用于端口号转换
- l代表4字节long,因此可以用于IP地址转换
inet_addr()
在实际应用中,我们在socket中绑定IP地址和端口号时,使用的是字符串类型,例如“192.168.121.222”,但是在bind()函数绑定的过程中,
我们需要传入的是sockaddr_in结构体中的32位整数型成员类型,所以我们需要将点分10进制的字符串类型转换为32位的整型数据,所以这里
就用到了inet_addr()函数
1 #include<arpa/inet.h> 2 in_addr_t inet_addr(const char*string);
当该函数调用成功是会返回32位的大端的网络字节序的整型数值,失败时会返回INADDR_NONE。
inet_aton()
在使用inet_addr()函数时返回的32位整型,在调用bind()函数时,需要将inet_addr()函数转换后的IP地址带入sockaddr_in结构体中的结构体变量中,
函数inet_aton()则不需要这个过程,该函数会自动将转换的结果填入该结构体变量
1 #include<arpa/inet.h> 2 int inet_aton(const char* string,struct in_addr*addr)
本文主要是参考书籍《TCP/IP 网络编程》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具