详解inet_pton()和inet_ntop()函数
i_pton是一个IP地址转换函数,可以在将IP地址在“点分十进制”和“二进制整数”之间转换,而且i_pton和i_n这2个函数能够处理ipv4和ipv6。算是比较新的函数了。
1.把ip地址转化为用于网络传输的二进制数值
int i_aton(const char cp, struct in_addr inp);
i_aton() 转换网络主机地址ip(如192.168.1.10)为二进制数值,并存储在struct in_addr结构中,即第二个参数inp,函数返回非0表示cp主机有地有效,返回0表示主机地址无效。(这个转换完后不能用于网络传输,还需要调用htons或htonl函数才能将主机字节顺序转化为网络字节顺序)
in_addr_t i_addr(const char cp);
i_addr函数转换网络主机地址(如192.168.1.10)为网络字节序二进制值,如果参数char cp无效,函数返回-1(INADDR_NONE),这个函数在处理地址为255.255.255.255时也返回-1,255.255.255.255是一个有效的地址,不过i_addr无法处理;
2.将网络传输的二进制数值转化为成点分十进制的ip地址
char i_ntoa(struct in_addr in);
i_ntoa 函数转换网络字节排序的地址为标准的ASCII以点分开的地址,该函数返回指向点分开的字符串地址(如192.168.1.10)的指针,该字符串的空间为静态分配的,这意味着在第二次调用该函数时,上一次调用将会被重写(复盖),所以如果需要保存该串复制出来自己管理!
我们如何输出一个点分十进制的IP呢?我们来看看狼蚁网站SEO优化的程序
#include <stdio.h> #include <sys/socket.h> #include <i/in.h> #include <arpa/i.h> #include <string.h> int main() { struct in_addr addr1,addr2; ulong l1,l2; l1= i_addr("192.168.0.74"); l2 = i_addr("211.100.21.179"); memcpy(&addr1, &l1, 4); memcpy(&addr2, &l2, 4); printf("%s : %s\n", i_ntoa(addr1), i_ntoa(addr2)); //注意这一句的运行结果 printf("%s\n", i_ntoa(addr1)); printf("%s\n", i_ntoa(addr2)); return 0; }
实际运行结果如下
192.168.0.74 : 192.168.0.74 //从这里可以看出,printf里的i_ntoa只运行了一次。
192.168.0.74
211.100.21.179
i_ntoa返回一个char ,而这个char 的空间是在i_ntoa里面静态分配的,所以i_ntoa后面的调用会覆盖上一次的调用。第一句printf的结果只能说明在printf里面的可变参数的求值是从右到左的,仅此而已。
3.新型网路地址转化函数i_pton和i_n
这两个函数是随IPv6出现的函数,对于IPv4地址和IPv6地址都适用,函数中p和n分别代表表达(presentation)和数值(numeric)。地址的表达格式通常是ASCII字符串,数值格式则是存放到套接字地址结构的二进制值。
#include <arpe/i.h> int i_pton(int family, const char strptr, void addrptr); //将点分十进制的ip地址转化为用于网络传输的数值格式 返回值若成功则为1,若输入不是有效的表达式则为0,若出错则为-1 const char i_n(int family, const void addrptr, char strptr, size_t len); //将数值格式转化为点分十进制的ip地址格式 返回值若成功则为指向结构的指针,若出错则为NULL
(1)这两个函数的family参数既可以是AF_INET(ipv4)也可以是AF_INET6(ipv6)。如果,以不被支持的地址族作为family参数,这两个函数都返回一个错误,并将errno置为EAFNOSUPPORT.
(2)第一个函数尝试转换由strptr指针所指向的字符串,并通过addrptr指针存放二进制结果,若成功则返回值为1,否则如果所指定的family而言输入字符串不是有效的表达式格式,那么返回值为0.
(3)i_n进行相反的转换,从数值格式(addrptr)转换到表达式(strptr)。i_n函数的strptr参数不可以是一个空指针。调用者必须为目标存储单元分配内存并指定其大小,调用成功时,这个指针就是该函数的返回值。len参数是目标存储单元的大小,以免该函数溢出其调用者的缓冲区。如果len太小,不足以容纳表达式结果,那么返回一个空指针,并置为errno为ENOSPC。
4.示例
i_pton(AF_INET, ip, &foo.sin_addr); // 代替 foo.sin_addr.addr=i_addr(ip); char str[INET_ADDRSTRLEN]; char ptr = i_n(AF_INET,&foo.sin_addr, str, sizeof(str)); // 代替 ptr = i_ntoa(foo.sin_addr)
以上所述是长沙网络推广给大家介绍的i_pton()和i_n()函数,希望对大家有所帮助,如果大家有任何疑问请给我留言,长沙网络推广会及时回复大家的。在此也非常感谢大家对狼蚁SEO网站的支持!
如果你觉得本文对你有帮助,欢迎网络推广网站推广转载,烦请注明出处,谢谢!
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程