http://blog.csdn.net/eagle51/article/details/53157643?utm_source=itdadao&utm_medium=referral

这两个函数是随IPv6出现的新函数,对于IPv4地址和IPv6地址都适用。函数名中的p和n非别代表表达(presentation)和数值(numeric)。地址的表达格式通常是ASCII字符串,数值格式则是存放到套接字地址结构中的二进制值。函数如下:

[cpp] view plaincopy print?
  1. #include<arpa/inet.h>
  2. int inet_pton(int family, const char *strptr, void *addrptr);
  3. 返回:若成功则为1,若输入不是有效的表达格式则为0,若出错则为-1
  4. const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
  5. 返回:若成功则为指向结果的指针, 若出错则为NULL
#include<arpa/inet.h>
int inet_pton(int family, const char *strptr, void *addrptr);返回:若成功则为1,若输入不是有效的表达格式则为0,若出错则为-1
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);返回:若成功则为指向结果的指针, 若出错则为NULL

这两个函数的family参数既可以是AF_INET,也可以是AF_INET6。如果以不被支持的地址族作为family的参数,这两个函数就都返回一个错误,并将errno置为EAFNOSUPPORT。

第一个函数尝试转换由strptr指针所指的字符串,并通过addrptr指针存放二进制结果。若成功则返回1,否则如果对所指定的family而言输入的字符串不是有效的表达式,那么值为0。

inet_ntop进行相反的转换,从数值格式(addrptr)转换到表达格式(strptr)。len参数是目标存储单元的大小,以免该函数溢出其调用者的缓冲区。为有助于指定这个大小,在<netinet/in.h>头文件中有如下定义:

[cpp] view plaincopy print?
  1. #define INET_ADDRSTRLEN   16
  2. #define INET6_ADDRSTRLEN 46
#define INET_ADDRSTRLEN   16
#define INET6_ADDRSTRLEN 46

如果len太小,不足以容纳表达式结果(包括结尾的空字符),那么返回一个空指针,并置errno为ENOSPC。

inet_ntop函数的strptr参数不可以是一个空指针。调用者必须为目标存储单元分配内存并指定其大小。调用成功时,这个指针就是该函数的返回值。

即使系统还不支持IPv6,也可以采取下列措施开始使用这些新函数,即用代码

[cpp] view plaincopy print?
  1. inet_pton(AF_INET, cp, &foo.sin_addr);
  2. 代替代码
  3. foo.sin_addr.s_addr = inet_addr(cp);
  4. 再用代码
  5. char str[INET_ADDRSTRLEN];
  6. ptr = inet_ntop(AF_INET, &foo.sin_addr, str, sizeof(str));
  7. 代替代码
  8. ptr = inet_ntoa(foo.sin_addr);
inet_pton(AF_INET, cp, &foo.sin_addr);
代替代码
foo.sin_addr.s_addr = inet_addr(cp);
再用代码
char str[INET_ADDRSTRLEN];
ptr = inet_ntop(AF_INET, &foo.sin_addr, str, sizeof(str));
代替代码
ptr = inet_ntoa(foo.sin_addr);

下面给出只支持IPv4的inet_pton函数的简单定义和只支持IPv4的inet_ntop函数的简化版本。

[cpp] view plaincopy print?
  1. int inet_pton(int family, const char *strptr, void *addrptr)
  2. {
  3. if(family == AF_INET) {
  4. struct in_addr in_val;
  5. if (inet_aton(strptr, &in_val)) {
  6. memcpy(addrptr, &in_val, sizeof(struct in_addr));
  7. return (0);
  8. }
  9. }
  10. errno = EAFNOSUPPORT;
  11. return (-1);
  12. }
int inet_pton(int family, const char *strptr, void *addrptr)
{if(family == AF_INET) {struct in_addr in_val;if (inet_aton(strptr, &in_val)) {memcpy(addrptr, &in_val, sizeof(struct in_addr));return (0);}}errno = EAFNOSUPPORT;return (-1);
}
[cpp] view plaincopy print?
  1. const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t lne)
  2. {
  3. const u_char *p = (const u_char *) addrptr;
  4. if(family == AF_INET) {
  5. char temp[INET_ADDRSTRLEN];
  6. snprintf(temp, sizeof(temp), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
  7. if (strlen(temp) >= len){
  8. errno = ENOSPC;
  9. return (NULL);
  10. }
  11. strcpy(strptr, temp);
  12. return (strptr);
  13. }
  14. errno = EAFNOSUPPORT;
  15. return (NULL);
  16. }

转载于:https://www.cnblogs.com/loanhicks/p/7368151.html

inet_pton函数和inet_ntop函数的用法及简单实现相关推荐

  1. inet_pton和inet_ntop函数

    Linux下这2个IP地址转换函数,可以在将IP地址在"点分十进制"和"整数"之间转换 而且,inet_pton和inet_ntop这2个函数能够处理ipv4和 ...

  2. linux内核中使用inet_ntop,linux网络编程之inet_pton和inet_ntop函数

    Linux下这2个IP地址转换函数,可以在将IP地址在"点分十进制"和"整数"之间转换 而且,inet_pton和inet_ntop这2个函数能够处理ipv4和 ...

  3. C++中inet_pton、inet_ntop函数

    参考: C++中inet_pton.inet_ntop函数_Promising丶的博客-CSDN博客_c++ inet_ntop 'inet_pton' was not declared in thi ...

  4. inet_pton()和inet_ntop()函数详解

    1.把ip地址转化为用于网络传输的二进制数值 int inet_aton(const char *cp, struct in_addr *inp); inet_aton() 转换网络主机地址ip(如1 ...

  5. inet_pton()和inet_ntop()函数使用实例

    概述 IP格式最常见的是使用点分10进制表示,如: xx.xx.xx.xx (IPV4地址). IP地址分为两类:IPv4地址和IPv6地址. IPv4 地址用32位来表示: IPv6 地址用128位 ...

  6. inet_pton、inet_ntop函数

    inet_pton和inet_ntop函数 这两个函数是随IPv6出现的函数,对于IPv4地址和IPv6地址都适用,函数中p和n分别代表表达(presentation)和数值(numeric).地址的 ...

  7. htons/ntohs、inet_aton/inet_ntoa、inet_pton/inet_ntop函数详解

    在介绍htons等函数之前,必须先介绍网络字节序与主机字节序 网络字节序和主机字节序 网络字节顺序NBO(Network Byte Order): 按从高到低的顺序存储,在网络上使用统一的网络字节顺序 ...

  8. inet_ntoa 和inet_ntop函数

    在使用visual studio开发程序时,使用了inet_ntoa,编译时提示: 严重性    代码    说明    项目    文件    行    禁止显示状态 错误    C4996     ...

  9. 网络编程——listen、conect、inet_pton等网络编程函数详解

    前言 自己在学习网络编程的所思所感所悟,记录于此,如果还有幸能帮助到您,是我的荣幸!很多网络编程的函数都没有见过也忘记了他的头文件,怎么办?在linux上使用man手册查函数即可,windows查ms ...

最新文章

  1. 留言本的漏洞挖掘总结
  2. 由浅入深laravel教程 :中间件
  3. python舵机控制程序_树莓派PWM控制舵机的两种方式
  4. 同步逻辑电路和异步逻辑电路
  5. 使用Windows8开发Metro风格应用四
  6. 牛客题霸 [最大数] C++题解/答案
  7. win7 安装 Visual Studio 2015 出现 “Failed to install MSI package 等错误”
  8. 利用console控制台调试php代码
  9. nvm装node npm
  10. kettle配置集群_KETTLE集群搭建
  11. android markdown编辑器,安卓版好用的Markdown编辑器
  12. Android入门项目(校园软件)
  13. python-sklearn实现一个简易的智能问答机器人
  14. 工业物联网快速解决方案
  15. CorelDRAW2023安装下载教程精简版矢量绘图软件
  16. Android组件化开发实践和案例分享 1
  17. H3C模拟器中文路径问题(提示:“当前系统用户名中包含非ASCII字符”! )方法尝试:
  18. 软件测试项目实战案例分解,跟着我一步一步操作【人力资源管理系统】
  19. 图片添加水印及打印文件
  20. uni-app的基础概念

热门文章

  1. 【HDU - 1269】迷宫城堡 (tarjan算法模板)
  2. c语言链表实现数组逆置,数组与链表等顺序表逆置
  3. Java 代码性能优化
  4. 215. 数组中的第K个最大元素 BFPRT最牛解法
  5. Git(6)-Git配置文件、底层操作命令
  6. 大数据学习(06)-- 云数据库
  7. java中的asList_Java中的Arrays.asList()方法
  8. 密码学专题 OpenSSL标准转换指令
  9. 算法 笔试的时候 如何输入元素?
  10. C++primer第八章 IO库 8.2 文件输入输出