- 在开发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函数