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 地址都能处理。

 

posted @   Disant  阅读(609)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示