UNP编程:33---名字与地址转换之(作废的IPV6地址解析函数:gethostbyname2、getipnodebyname、freehostent、RES_USE_INET)

  • 在开发IPv6期间,用于查找IPv6地址的API经历了若干次反复。这些早期的API既复杂又没 有足够的灵活性,于是在RFC 2553[Gilligan et al. 1999]中被淘汰掉。RFC 2553又引入了新的 函数,它们最终在RFC 3493[Gilligan et al. 2003]中被简单地替换成getaddrinfo和 getnameinfo。本节简要介绍一些早期的API,以辅助转换已经使用它们的程序

一、RES_USE_INET6常值

  • gethostbyname没有可指定所关心地址族的参数(就像getaddrinfo的hints.ai_family结构成员),因此这个API的第一个修订本使用RES_USE_INET6常值,使用者必须以一个私用的 内部接口把该常值加到解析器标志中。这个API不大容易移植,因为使用别的内部解析器接口 的系统不得不模仿BIND解析器接口以提供它

  • 启用RES_USE_INET6会使gethostbyname首先查找AAAA记录,若找不到任何AAAA记录 则接着查找A记录。因为hostent结构只有一个地址长度字段,所以gethostbyname只能要么返 回IPv6地址,要么返回IPv4地址,而不能同时返回这两种地址。

  • 启用RES_USE_INET6还会使gethostbyname2以IPv4映射的IPv6地址的形式返回IPv4地址

二、gethostbyname2函数

#include <sys/socket.h>
#include <netdb.h>
struct hostent *gethostbyname2(const char *name, int af);

//返回:若成功则为非空指针,若出错则为NULL且设置h_errno 
  •  gethostbyname2函数给gethostbyname增设了一个地址族参数
  • 当af参数为AF_INET时,gethostbyname2的行为与gethostbyname一样,即查找并返回 IPv4地址。当af参数为AF_INET6时,gethostbyname2只查找AAAA记录并返回IPv6地址

三、getipnodebyname函数

#include <sys/socket.h>
#include <netdb.h>
struct hostent *getipnodebyname(const char *name, int af,
    int flags, int *error_num);

//返回:若成功则为非空指针,若出错则为NULL且设置error_num 
  • RFC 2553[Gilligan et al. 1999]因为RES_USE_INET6标志的全局特性以及对返回信息进行 更多控制的愿望而废除了RES_USE_INET6和gethostbyname2。为了解决其中一些问题,它同时 引入getipnodebyname函数
  • 本函数返回的指针指向的是我们随gethostbyname函数讲解过的hostent结构。af和flags 这两个参数直接映射到getaddrinfo的hints.ai_family和hints.ai_flags参数

四、freehostent函数

#include <netdb.h>
void freehostent(struct hostent *ptr); 
  •  为了线程安 全起见,getipnodebyname函数的返回值是动态分配的,因而必须使用freehostent函数释放
  • getipnodebyname和与之匹配的getipnodebyaddr函数被RFC 3493[Gilligan et al. 2003] 废除,并代之以getaddrinfo和getnameinfo函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董哥的黑板报

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值