IP地址转换
1. 先了解一下需要用到的数据类型
1 typedef uint32_t in_addr_t;
in_addr_t 这个类型保存的数据,不能确定是按照本机字节序保存的,还是网络字节序保存的。
2. 为了解决这个问题,Linux又定义了一个新的结构体类型 struct in_addr,它明确表示,它保存的 ip 地址就是网络字节序的。
1 struct in_addr { 2 in_addr_t s_addr; 3 };
如果你传递了一个本机字节序的 unsigned int 类型的整数给 in_addr 的 s_addr 成员,那么,后面使用到该结构体的函数 都会出错。
3. 套接字地址在程序中的显示
这个结构体如下
1 struct sockaddr_in { 2 sa_family_t sin_family; //这个值固定写为 AF_INET 3 in_port_t sin_port; //网络字节序的端口号 4 struct in_addr sin_addr; //in_addr 类型的 ip 地址 5 }
4. 函数
in_addr_t inet_addr(const char *cp);
in_addr_t inet_network(const char *cp);
inet_addr 和 inet_network 函数都是用于将字符传形式转换为整数形式使用,两者区别很小,inet_addr 返回的整数形式是网络字节序,而 inet_network 返回的是整数形式是主机字节序。
它们都有一个小缺陷,那就是当 IP 是 255.255.255.255 时,它们两个会认为这是一个无效的 IP 地址,这是历史遗留问题,其实在目前大部分的路由器上,这个 255.255.255.255 的 IP 都是有效的。
在Unix网络编程中,我们常用到地址转换函数,他将 ASCII 字符串(如 "206.62.226.33" )与网络字节序的二进制值(这个值保存在套接口地址结构中)键进行地址的转换。
1. inet_aton、inet_addr 和 inet_ntoa 在淀粉十进制数串(如 "206.62.226.33" )与他的32为网络字节序二进制值间转换 IPv4 地址。
2. 两个较新的函数:inet_pton 和 inet_ntop 对 IPv4 和 IPv6 地址都能处理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本