RESOLVER - Linux手册页
Linux程序员手册 第3部分
更新日期: 2019-03-06
名称
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-解析程序例程
语法
#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链接。
说明
注意:此页面不完整(未描述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中传递)。用户通常操纵的该结构的唯一字段是选项字段。该字段可以包含以下选项的按位"或":
- 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_RECURSE,RES_DEFNAMES,RES_DNSRCH和RES_NOIP6DOTINT。
返回值
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))来确定错误的原因。
文件
- /etc/resolv.conf
- 解析器配置文件
- /etc/host.conf
- 解析器配置文件
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
res_ninit(),res_nclose(),res_nquery(), res_nsearch(),res_nquerydomain(),res_nsend() | Thread safety | MT-Safe locale |
res_nmkquery(),dn_comp(), dn_expand() | Thread safety | MT-Safe |
遵循规范
4.3BSD。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。