ip地址转换相关的函数接口
在了解下面的函数接口之前,首先需要了解如下一些概念和术语:
- 网络字节序和本机字节序。即大小端格式。标准规定
网络字节序
为大端模式
。 - ip地址的分类:
- IPv4地址:共32bit.由
网络号
+主机号
组成。按照网络号和主机号所占位数的不同,分为A~E五类地址。具体内容自行百度吧。 - IPv6地址。
- IPv4地址:共32bit.由
- ip地址的表示方法:
数值表示法
:用uint32_t类型的大端模式整数表示。点分字符串表示法
:如"192.168.1.110".
- 域名。为了使ip地址方便记忆,便使用了域名进行映射。即
www.baibu.com
之类的名称。
下面的函数接口主要分为两类:
- ip地址的
点分字符串表示法
与数值表示法
之间的转换。涉及到了6个函数。包括一些过时的接口。 - 获取IPv4地址中的网络号和主机号。涉及到两个函数。
下面函数使用时需要包含arpa/inet.h
。
int inet_aton(const char *cp,struct in_addr *inp)
- 转换
点分字符串表示法
(如"192.168.1.110")到数值表示法
(网络字节序)。 - cp:要转换的点分字符串。
- inp:存放转换后的数值。
- return:成功返回不为零的值,失败返回0.
- 转换
in_addr_t inet_addr(const char *cp)
- 过时接口。功能类似inet_aton()函数。主要区别是如果输入的cp无效,就会返回
INADDR_NONE
表示地址错误,但其实INADDR_NONE
(255.255.255.255)也是一个有效地址。即无法区分INADDR_NONE
地址的转换。
- 过时接口。功能类似inet_aton()函数。主要区别是如果输入的cp无效,就会返回
in_addr_t inet_network(const char *cp)
- 过时接口。功能类似inet_addr()函数。不过返回的数值地址是主机字节序。
char *inet_ntoa(struct in_addr in)
- 与inet_aton()函数相反,将数值地址转换成点分字符串地址。返回转换后的地址。由于每个线程都会有一个字符串地址的实体buff.所以它是线程安全的。但在同一线程下,第二次调用会覆盖第一次转换的值。所以在必要时需要自己复制保存。
const char *inet_ntop(int af, const void *src,char *dst, socklen_t size)
- 它是inet_ntoa()函数的升级版本,可以用来解析IPv6地址.
- af:要么是
AF_INET
(IPv4)要么是AF_INET6
(IPv6). - src:
数值表示法
的ip地址。 - dst:用于存放转换后的
点分字符串表示法
字符串的实体buff。 - size:dst实体buff的大小
- return:成功返回dst的指针。失败返回NULL.
int inet_pton(int af,const char *src,void *dst)
- 它是inet_aton()函数的升级版本,可以用来解析IPv6地址.各个参数的含义和inet_ntop()中的差不多。
- return:成功返回1.0表示src输入错误。-1表示af指示错误。
struct in_addr inet_makeaddr(in_addr_t net, in_addr_t host)
- 由网络号和主机号制作一个IPv4地址。
in_addr_t inet_lnaof(struct in_addr in)
- 获取地址的主机号。
in_addr_t inet_netof(struct in_addr in)
- 获取地址的网络号.
下面是一个简单的函数使用例子。
#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
void main(void)
{
char *strIp = "1.2.3.4";
struct in_addr ipIs;
int res = inet_aton(strIp,&ipIs);//将点分字符串地址转换为数值地址。
if(res == 1){
printf("%08X\n",ipIs.s_addr);//ipIs.s_addr为大端格式的ip数值地址
}
res = inet_network(strIp);//将点分字符串地址转换为数值地址。
if(res > 0){
printf("%08X\n",res);//res为小端格式的ip数值地址
}
struct in_addr tempIp = inet_makeaddr(0x01,0x020304);
printf("%08X\n",tempIp.s_addr);
in_addr_t number = inet_netof(tempIp);
printf("网络号为:%08X\n",number);
number = inet_lnaof(tempIp);
printf("主机号为:%08X\n",number);
}
关于技术交流
此处后的文字已经和题目内容无关,可以不看。
qq群:825695030
微信公众号:嵌入式的日常
如果上面的文章对你有用,欢迎打赏、点赞、评论。