inet_pton函数和inet_ntop函数的用法及简单实现

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 5.7 延迟同步_MySQL5.6升级5.7时出现主从延迟问题排查过程

最近在做zabbix的数据库MySQL5.6升级5.7时&#xff0c;出现主从延迟问题&#xff0c;这个问题困扰了很久没有解决&#xff0c;昨天终于解决了&#xff0c;整理了一下整个排查过程&#xff0c;分享给大家。环境说明&#xff1a;mysql主库为5.6的版本&#xff0c;有四个从库&…

架构设计--仅是软件开发之第二大影响力?!

SDWest2006&#xff08;译注1&#xff09;对我来说是个有趣的大会。我除了星期三之外&#xff08;当时我正飞往费城参加一个客户会议 因此错过了Jolt颁奖部分&#xff09;每天都在演讲。我也参加了一些谈话和会议&#xff1b;其中最引人关注的是Mike Cohn的计划与估算的谈话。…

WiFi密码分享有妙招 不必口头相传

移动互联网的迅速崛起&#xff0c;使得我们可以方便的使用手持移动设备进行上网。尤其是在家庭中&#xff0c;使用智能手机、平板电脑、笔记本电脑等移动设备进行上网和娱乐已经成为主流&#xff0c;台式机上网正日渐式微。在家中时&#xff0c;我们通过无线路由器提供的WiFi网…

javaweb(二十一)——JavaWeb的两种开发模式

一、JSPJavaBean开发模式 1.1、jspjavabean开发模式架构 jspjavabean开发模式的架构图如下图(图1-1)所示 图1-1 在jspjavabean架构中&#xff0c;JSP负责控制逻辑、表现逻辑、业务对象&#xff08;javabean&#xff09;的调用。 JSPJavaBean模式适合开发业务逻辑不太复杂的web应…

Redis基于客户端分片的集群案例(待实践)

说明&#xff1a; 下面的示例基本都是基于Linux去实现&#xff0c;目的是为了环境的统一&#xff0c;以便于把性能调整到最优。且基于Java。建议生产环境不要使用Windows/Mac OS这些。 在Java领域&#xff0c;基于客户端进行分片最常用的库应该是Jedis&#xff0c;下面基本是基…

mysql select 效能_MYSQL的联合查询最好是少用,效能差异巨大

同样的功能,不同的写法,时间和内存占用差了几千倍,不废话,直接上代码第一种写法:代码如下:$RsDB::get($_ENV[DB],3,"SELECT * FROM _xiazhu WHERE uid IN(SELECT id FROM _user WHERE id<5000)");var_dump($Rs);内存和时间:内存使用:96514.53Kb 运行时间:1272.73m…

高效程序员应该养成的七个习惯

对于软件工程师来说&#xff0c;工作也许意味着许多东西 -- 稳定的收入、做自己感兴趣的项目、找一份更好工作的跳板&#xff0c;或者你只是喜欢与其他程序员共事。但说到“效率”&#xff0c;强调的是在一定时间内按质完成项目的能力。Phil Chu根据自己的经验提出了高效程序员…

概率论与数理统计思维导图知识框架_考研概率论与数理统计 综合题型秘籍思维导图① 随机变量1~3章 [21考研上岸之旅]...

Hello World&#xff0c;我的朋友&#xff0c;这里是一颗小白蛋&#xff0c;大千世界&#xff0c;很高兴以这样的方式与你相遇前言在复习过程中发现概率论知识点很少且集中 所以没有分开章节去整理王安式概率论辅导讲义张宇概率论9讲方浩强化班1800题 综合题型秘籍在学习过程中…

关于软件的架构设计

好的开始相当于成功一半 开始之初的架构设计决定着软件产品的生死存亡。“好的开始相当于成功一半”。 开始的架构设计也是最难的&#xff0c;需要调研同类产品的情况以及技术特征&#xff0c;了解当前世界上对这种产品所能提供的理论支持和技术平台支持。再结合自己项目的特…

[Oracle]快速构造大量数据的方法

[Oracle]快速构造大量数据的方法&#xff1a;create table tab001(id integer primary key, val varchar2(100));insert into tab001 select ij,rpad(to_char(ij),100,A) from ( with DATA2(j) as ( select 0 j from DUAL …

mysql用supervisor管理_Supervisor使用详解

一、supervisor简介Supervisor是用Python开发的一套通用的进程管理程序&#xff0c;能将一个普通的命令行进程变为后台daemon&#xff0c;并监控进程状态&#xff0c;异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动&#xff0c…

Handle/Body pattern(Wrapper pattern)

Handle Body Pattern 一些设计模式&#xff0c;通过一系列非直接的间接的方式&#xff08;这种间接的方式&#xff0c;可称其为 handle&#xff08;把手&#xff09;&#xff09;&#xff0c;完成接口与实现&#xff08;实现可称为 body&#xff08;主体&#xff09;&#xff0…

架构设计贵在务实

(本文是我给温昱先生新书写的读后感节选。&#xff09; 我最早听说“软件架构”这个概念以及UML的名字&#xff0c;是在1999年的水木清华BBS上。当时有一篇文章介绍了软件架构作为一个相对独立的领域的发展情况&#xff0c;顺便提到在此前一年被接纳为OMG标准的UML。该文作者…

php mysql删除失败_php+MySQL实战案例【七】数据编辑、删除

​本节内容中讲解用户管理模块中的修改用户信息和删除用户。修改用户信息&#xff1a;可对选择的用户记录进行编辑&#xff0c;可修改用户名、密码、性别、手机、邮箱和地址信息。删除用户信息&#xff1a;将列表中指定的用户进行删除操作。二、编辑用户信息编辑用户信息&#…

前端每周清单第 34 期:Vue 现状盘点与 3.0 展望,React 代码迁移与优化,图片优化详论...

作者&#xff1a;王下邀月熊 编辑&#xff1a;徐川 前端每周清单专注前端领域内容&#xff0c;以对外文资料的搜集为主&#xff0c;帮助开发者了解一周前端热点&#xff1b;分为新闻热点、开发教程、工程实践、深度阅读、开源项目、巅峰人生等栏目。欢迎关注【前端之巅】微信公…

1.three.js世界的4大要素

一、三大组件 在Three.js中&#xff0c;要渲染物体到网页中&#xff0c;我们需要3个组建&#xff1a;场景&#xff08;scene&#xff09;、相机&#xff08;camera&#xff09;和渲染器&#xff08;renderer&#xff09;。有了这三样东西&#xff0c;才能将物体渲染到网页中去。…

架构设计 例子和实践

系统设计说明书(架构、概要、详细)目录结构 虽然这些文档一般来说公司都是有模板的&#xff0c;但我写这些文档以来基本上是每写一次就把目录结构给改一次&#xff0c;应该说这是因为自己对这些文档的理解开始加深&#xff0c;慢慢的越来越明白这些文档的作用和其中需要阐述的东…

activiti 批量 mysql_Activiti6系列(3)- 快速体验

一、部署启动activiti####1、部署&#xff0c;将两个war包拷贝到Tomcat下即可。![](https://img2018.cnblogs.com/blog/1755845/201908/1755845-20190802010532367-2002399291.png)2、启动tomcat&#xff0c;访问http://127.0.0.1:8080/activiti-app默认账号密码&#xff1a;ad…

【启动】Windows上启动图形化软件,报错: 无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-1-1-0.dll...

今天在安装了jetbrains官网上的ToolBox软件后&#xff0c;没有办法启动起来&#xff0c;报错如下&#xff1a; 无法启动此程序&#xff0c;因为计算机中丢失api-ms-win-crt-runtime-1-1-0.dll 尝试重新安装了并没有什么用&#xff0c;现在来解决方法&#xff1a; 直接找到官方的…

论文: YOLO9000-Better,Faster,Stronger

论文阅读&#xff1a; YOLO9000-Better,Faster,Stronger YOLOv2 是经过改造之后的YOLO Batch Normalization&#xff1a;在所有的conv layer后加了BN之后提高了2% mAP&#xff0c;BN可以帮助regularize模型&#xff0c;这样的话就可以放弃 dropout。 High Resolution Classifi…