说明

注意:此页面不完整(未描述glibc提供的各种解析器功能),并且可能已过时。

下述功能对Internet域名服务器进行查询并解释其响应。

API由一组更现代的可重入函数和一组较旧的不可重入函数组成,这些函数已被取代。传统的解析器接口(例如res_init()和res_query())使用存储在_res结构中的某些静态(全局)状态,从而使这些函数成为非线程安全的。 BIND 8.2引入了一组新接口res_ninit(),res_nquery()等,它们以res_state作为它们的第一个参数,因此可以使用每个线程的解析器状态。

res_ninit()和res_init()函数读取配置文件(请参阅resolv.conf(5))以获取默认域名和名称服务器地址。如果未提供服务器,则尝试使用本地主机。如果没有给出域,则使用与本地主机关联的域。可以使用环境变量LOCALDOMAIN覆盖它。通常通过第一次调用其他函数之一来执行res_ninit()或res_init()。每次对res_ninit()的调用都需要对res_nclose()进行相应的调用,以释放由res_ninit()分配的内存以及随后对res_nquery()的调用。

res_nquery()和res_query()函数在名称服务器中查询指定类型和类的标准域名。答复保留在呼叫者提供的长度为anslen的缓冲区应答中。

res_nsearch()和res_search()函数进行查询并等待响应,例如res_nquery()和res_query(),但它们还实现了由RES_DEFNAMES和RES_DNSRCH控制的默认规则和搜索规则(请参见下面的_res选项的说明)。

res_nquerydomain()和res_querydomain()函数使用res_nquery()/ res_query()对名称和域进行串联查询。

以下函数是res_nquery()/ res_query()使用的低级例程。

res_nmkquery()和res_mkquery()函数以buflen为域名dname构造长度为buflen的查询消息。查询类型op是以下之一(通常为QUERY):

QUERY
标准查询。
IQUERY
逆查询。该选项已在glibc 2.26中删除,因为很长时间以来DNS服务器一直不支持该选项。
NS_NOTIFY_OP
通知次要SOA(授权开始)更改。

newrr当前未使用。

res_nsend()和res_send()函数发送以msglen为长度的味精给出的预格式化查询,并返回答案中长度为anslen的答案。如果尚未调用res_ninit()/ res_init(),则将调用它们。

dn_comp()函数压缩域名exp_dn并将其存储在长度为length的缓冲区comp_dn中。压缩使用指向当前消息中先前压缩名称的指针dnptrs数组。第一个指针指向消息的开头,列表以NULL结尾。数组的限制由lastdnptr指定。如果dnptr为NULL,则不压缩域名。如果lastdnptr为NULL,则标签列表不会更新。

dn_expand()函数将压缩的域名comp_dn扩展为完整的域名,该域名位于大小为长度的缓冲区exp_dn中。压缩的名称包含在查询或回复消息中,而msg指向消息的开头。

解析程序例程使用__res_state结构中包含的配置和状态信息(对于较旧的非重入函数,则作为statep参数传递,或者在全局变量_res中传递)。通常由用户操纵的此结构的唯一字段是options字段。该字段可以包含以下选项的按位"或":

RES_INIT
如果已调用res_ninit()或res_init(),则为true。
RES_DEBUG
打印调试消息。仅当glibc是在启用调试功能的情况下构建的(不是默认设置)时,此选项才可用。
RES_AAONLY(unimplemented; deprecated in glibc 2.25)
仅接受权威性答案。 res_send()一直持续到找到权威答案或返回错误为止。该选项存在,但在glibc中直到版本2.24才实现;从glibc 2.25开始,它已被弃用,并且其用法会产生警告。
RES_USEVC
使用TCP连接查询而不是UDP数据报。
RES_PRIMARY(unimplemented; deprecated in glibc 2.25)
仅查询主域名服务器。该选项存在,但在glibc中直到版本2.24才实现;从glibc 2.25开始,它已被弃用,并且其用法会产生警告。
RES_IGNTC
忽略截断错误。请勿重试TCP。
RES_RECURSE
在查询中设置所需的递归位。递归是由域名服务器而不是由res_send()执行的。 [默认启用]。
RES_DEFNAMES
如果设置,res_search()会将默认域名附加到单个组件名称上,即不包含点的组件名称。 [默认启用]。
RES_STAYOPEN
与RES_USEVC一起使用以保持查询之间的TCP连接打开。
RES_DNSRCH
如果设置,则res_search()将在当前域和父域中搜索主机名。 gethostbyname(3)使用此选项。 [默认启用]。
RES_INSECURE1
接受来自错误服务器的响应。这可以用来检测潜在的安全隐患,但是您需要在启用调试的情况下编译glibc并使用RES_DEBUG选项(仅用于调试目的)。
RES_INSECURE2
接受包含错误查询的响应。这可以用来检测潜在的安全隐患,但是您需要在启用调试的情况下编译glibc并使用RES_DEBUG选项(仅用于调试目的)。
RES_NOALIASES
禁用HOSTALIASES环境变量的使用。
RES_USE_INET6
gethostbyname(3)函数内部的A查询之前尝试AAAA查询,如果未找到AAAA记录但存在A记录集,则以IPv6"隧道形式"映射IPv4响应。从glibc 2.25开始,此选项已被弃用,其用法会产生警告。应用程序应使用getaddrinfo(3),而不是gethostbyname(3)。
RES_ROTATE
导致从列出的名称服务器中轮流选择名称服务器。这具有将查询负载分散到所有列出的服务器之间的效果,而不是让所有客户端每次都首先尝试第一个列出的服务器。
RES_NOCHECKNAME(unimplemented; deprecated in glibc 2.25)
禁用现代BIND检查传入的主机名和邮件名是否包含下划线(_),非ASCII或控制字符等无效字符。直到版本2.24为止,glibc中都存在此选项。从glibc 2.25开始,它已被弃用,并且其用法会产生警告。
RES_KEEPTSIG(unimplemented; deprecated in glibc 2.25)
不要剥离TSIG记录。该选项存在,但在glibc中直到版本2.24才实现;从glibc 2.25开始,它已被弃用,并且其用法会产生警告。
RES_BLAST(unimplemented; deprecated in glibc 2.25)
同时将每个查询递归发送到所有服务器。该选项存在,但在glibc中直到版本2.24才实现;从glibc 2.25开始,它已被弃用,并且其用法会产生警告。
RES_USEBSTRING(glibc 2.3.4 to 2.24)
使用RFC 2673中描述的位标签格式进行反向IPv6查找。如果未设置此选项(默认设置),则使用半字节格式。该选项在glibc 2.25中已删除,因为它依赖于从未在Internet上部署的向后不兼容的DNS扩展。
RES_NOIP6DOTINT(glibc 2.24 and earlier)
在IPv6反向查找中使用ip6.arpa区域,而不是从glibc 2.3.4开始不推荐使用的ip6.int。此选项在glibc中(包括2.24版及更高版本)存在,默认情况下已启用。在glibc 2.25中,此选项已删除。
RES_USE_EDNS0(since glibc 2.6)
启用对RFC 2671中描述的DNS扩展(EDNS0)的支持。
RES_SNGLKUP(since glibc 2.10)
默认情况下,从2.9版开始,glibc并行执行IPv4和IPv6查找。某些设备DNS服务器无法正确处理这些查询,并使请求超时。此选项禁用该行为,并使glibc顺序执行IPv6和IPv4请求(以解决过程变慢的代价)。
RES_SNGLKUPREOP
启用RES_SNGLKUP选项时,将为每个请求打开一个新的套接字。
RES_USE_DNSSEC
在OPT记录中的OK位使用DNSSEC。此选项表示RES_USE_EDNS0。
RES_NOTLDQUERY
不要将不合格的名称查找为顶级域(TLD)。
RES_DEFAULT
默认选项意味着:RES_RECURSERES_DEFNAMES,RES_DNSRCH和RES_NOIP6DOTINT。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
res_ninit(),res_nclose(),res_nquery(),
res_nsearch(),res_nquerydomain(),res_nsend()
Thread safetyMT-Safe locale
res_nmkquery(),dn_comp(),
dn_expand()
Thread safetyMT-Safe
RESOLVER - Linux手册页

Linux程序员手册 第3部分
更新日期: 2019-03-06

返回值

res_ninit()和res_init()函数成功返回0,如果发生错误则返回-1。

res_nquery(),res_query(),res_nsearch(),res_search(),res_nquerydomain(),res_querydomain(),res_nmkquery(),res_mkquery(),res_nsend()和res_send()函数返回响应的长度,或者如果发生错误,则为-1。

dn_comp()和dn_expand()函数返回压缩名称的长度,如果发生错误,则返回-1。

如果从res_nquery(),res_query(),res_nsearch(),res_search(),res_nquerydomain()或res_querydomain()返回错误,则可以查询全局变量h_errno(请参阅gethostbyname(3))来确定错误的原因。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

文件

/etc/resolv.conf
解析器配置文件
/etc/host.conf
解析器配置文件

遵循规范

4.3BSD。

语法

#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>

struct __res_state;
typedef struct __res_state *res_state;

int res_ninit(res_state statep);

void res_nclose(res_state statep);

int res_nquery(res_state statep,
           const char *dname, int class, int type,
           unsigned char *answer, int anslen);

int res_nsearch(res_state statep,
           const char *dname, int class, int type,
           unsigned char *answer, int anslen);

int res_nquerydomain(res_state statep,
           const char *name, const char *domain,
           int class, int type, unsigned char *answer,
           int anslen);

int res_nmkquery(res_state statep,
           int op, const char *dname, int class,
           int type, const unsigned char *data, int datalen,
           const unsigned char *newrr,
           unsigned char *buf, int buflen);

int res_nsend(res_state statep,
           const unsigned char *msg, int msglen,
           unsigned char *answer, int anslen);

int dn_comp(const char *exp_dn, unsigned char *comp_dn,
           int length, unsigned char **dnptrs,
           unsigned char **lastdnptr);

int dn_expand(const unsigned char *msg,
           const unsigned char *eomorig,
           const unsigned char *comp_dn, char *exp_dn,
           int length);

Deprecated

extern struct __res_state _res;

int res_init(void);

int res_query(const char *dname, int class, int type,
           unsigned char *answer, int anslen);

int res_search(const char *dname, int class, int type,
           unsigned char *answer, int anslen);

int res_querydomain(const char *name, const char *domain,
           int class, int type, unsigned char *answer,
           int anslen);

int res_mkquery(int op, const char *dname, int class,
           int type, const unsigned char *data, int datalen,
           const unsigned char *newrr,
           unsigned char *buf, int buflen);

int res_send(const unsigned char *msg, int msglen,
           unsigned char *answer, int anslen);

与-lresolv链接。

名称

res_ninit,res_nclose,res_nquery,res_nsearch,res_nquerydomain,res_nmkquery,res_nsend,res_init,res_query,res_search,res_querydomain,res_mkquery,res_send,dn_comp,dn_expand-解析程序例程

另外参见

gethostbyname(3),resolv.conf(5),resolver(5),主机名(7),命名(8)

GNU C库源文件解析/自述文件。

日期:2019-08-20 18:00:08 来源:oir作者:oir