inet_res
inet_res
模块
inet_res
模块摘要
基本的DNS客户端。
描述
该模块执行DNS名称解析递归名称服务器。
另请参阅ERTS User's Guide: Inet Configuration
有关如何为IP通信配置Erlang运行时系统以及如何通过定义'dns'
查找方法来启用此DNS客户端的更多信息。DNS客户端然后作为解析功能的后端inet
。
即使该DNS客户端不用于节点中的正常名称解析,该DNS客户端也可以解析DNS记录。
这不是一个完整的解析器,只有依赖于要求可信的递归名称服务器的DNS客户端。
名称解析
使用UDP查询除非解析器选项usevc
是true
强制TCP查询。如果查询对于UDP来说太大,则使用TCP。对于常规DNS查询,512字节是大小限制。
当启用EDNS(解析器选项edns
设置为EDNS版本(即,0
而不是false
))时,解析器选项udp_payload_size
设置限制。如果名称服务器回复TC位设置(截断),表示答案不完整,则查询udp_payload_size
如果启用了EDNS,Resolver选项还会将通告的大小设置为允许的最大回复大小,否则名称服务器将使用512字节的限制,如果回复较大,则会被截断,从而导致TCP请求。
对于UDP查询,解析器选项timeout
和retry
控制重传。nameservers
列表中的每个名称服务器都会尝试超时timeout
/retry
。然后,再次尝试所有名称服务器,使总retry
次数增加一倍。
对于不使用search
列表的查询,如果查询全部nameservers
结果{error,nxdomain}
或空答案,则尝试使用相同的查询alt_nameservers
。
Resolver类型
以下数据类型涉及解析器:
数据类型
res_option() =
{alt_nameservers, [
nameserver()
]} |
{edns, 0 | false} |
{inet6, boolean()} |
{nameservers, [
nameserver()
]} |
{recurse, boolean()} |
{retry, integer()} |
{timeout, integer()} |
{udp_payload_size, integer()} |
{usevc, boolean()}
nameserver() = {
inet:ip_address()
, Port :: 1..65535}
res_error() =
formerr |
qfmterror |
servfail |
nxdomain |
notimp |
refused |
badvers |
timeout
DNS类型
以下数据类型涉及DNS客户端:
数据类型
dns_name() = string()
没有相邻点的字符串。
rr_type() =
a |
aaaa |
cname |
gid |
hinfo |
ns |
mb |
md |
mg |
mf |
minfo |
mx |
naptr |
null |
ptr |
soa |
spf |
srv |
txt |
uid |
uinfo |
unspec |
wks
dns_class() = in | chaos | hs | any
dns_msg() = term()
这是一个不透明数据结构的层次结构的开始,它可以用访问函数进行检查inet_dns
,该函数返回{Field,Value}
元组列表。arity 2函数仅返回指定字段的值。
dns_msg() = DnsMsg
inet_dns:msg(DnsMsg) ->
[ {header, dns_header()}
| {qdlist, dns_query()}
| {anlist, dns_rr()}
| {nslist, dns_rr()}
| {arlist, dns_rr()} ]
inet_dns:msg(DnsMsg, header) -> dns_header() % for example
inet_dns:msg(DnsMsg, Field) -> Value
dns_header() = DnsHeader
inet_dns:header(DnsHeader) ->
[ {id, integer()}
| {qr, boolean()}
| {opcode, 'query' | iquery | status | integer()}
| {aa, boolean()}
| {tc, boolean()}
| {rd, boolean()}
| {ra, boolean()}
| {pr, boolean()}
| {rcode, integer(0..16)} ]
inet_dns:header(DnsHeader, Field) -> Value
query_type() = axfr | mailb | maila | any | rr_type()
dns_query() = DnsQuery
inet_dns:dns_query(DnsQuery) ->
[ {domain, dns_name()}
| {type, query_type()}
| {class, dns_class()} ]
inet_dns:dns_query(DnsQuery, Field) -> Value
dns_rr() = DnsRr
inet_dns:rr(DnsRr) -> DnsRrFields | DnsRrOptFields
DnsRrFields = [ {domain, dns_name()}
| {type, rr_type()}
| {class, dns_class()}
| {ttl, integer()}
| {data, dns_data()} ]
DnsRrOptFields = [ {domain, dns_name()}
| {type, opt}
| {udp_payload_size, integer()}
| {ext_rcode, integer()}
| {version, integer()}
| {z, integer()}
| {data, dns_data()} ]
inet_dns:rr(DnsRr, Field) -> Value
对上述类型有一个信息功能:
inet_dns:record_type(dns_msg()) -> msg;
inet_dns:record_type(dns_header()) -> header;
inet_dns:record_type(dns_query()) -> dns_query;
inet_dns:record_type(dns_rr()) -> rr;
inet_dns:record_type(_) -> undefined.
所以,inet_dns:(inet_dns:record_type(X))(X)
将任何这些数据结构转换为{Field,Value}
名单。
dns_data() =
dns_name()
|
inet:ip4_address()
|
inet:ip6_address()
|
{MName ::
dns_name()
,
RName ::
dns_name()
,
Serial :: integer(),
Refresh :: integer(),
Retry :: integer(),
Expiry :: integer(),
Minimum :: integer()} |
{
inet:ip4_address()
, Proto :: integer(), BitMap :: binary()} |
{CpuString :: string(), OsString :: string()} |
{RM ::
dns_name()
, EM ::
dns_name()
} |
{Prio :: integer(),
dns_name()
} |
{Prio :: integer(),
Weight :: integer(),
Port :: integer(),
dns_name()
} |
{Order :: integer(),
Preference :: integer(),
Flags :: string(),
Services :: string(),
Regexp :: string(),
dns_name()
} |
[string()] |
binary()
Regexp
是一个字符串,其中的字符以UTF-8编码标准编码。
出口
getbyname(Name, Type) -> {ok, Hostent} | {error, Reason}
getbyname(Name, Type, Timeout) -> {ok, Hostent} | {error, Reason}
类型
为指定的主机,类别解析指定类型的DNS记录in
。成功返回地址列表字段中hostent()
包含dns_data()
元素的记录。
此功能使用解析器选项search
,它是一个域名列表。如果要解析的名称不包含点,则会将其前缀添加到搜索列表中的每个域名,并按顺序尝试。如果名称包含点,则首先尝试将其作为绝对名称,如果失败,则使用搜索列表。如果该名称有尾点,则该名称应该是绝对名称,并且不使用搜索列表。
gethostbyaddr(Address) -> {ok, Hostent} | {error, Reason}
gethostbyaddr(Address, Timeout) -> {ok, Hostent} | {error, Reason}
类型
后端函数使用inet:gethostbyaddr/1
。
gethostbyname(Name) -> {ok, Hostent} | {error, Reason}
gethostbyname(Name, Family) -> {ok, Hostent} | {error, Reason}
gethostbyname(Name, Family, Timeout) ->
{ok, Hostent} | {error, Reason}
类型
后端函数使用inet:gethostbyname/1,2
。
这个功能search
就像使用解析器选项一样getbyname/2,3
。
如果解析器选项inet6
是true
,则查找IPv6地址。如果失败,则查找IPv4地址并以IPv6映射的IPv4格式返回。
lookup(Name, Class, Type) -> [dns_data()]
lookup(Name, Class, Type, Opts) -> [dns_data()]
lookup(Name, Class, Type, Opts, Timeout) -> [dns_data()]
类型
解析指定名称的指定类型和类的记录的DNS数据。如果成功,筛选出答案记录用正确的Class
和Type
,并返回其数据字段的列表。因此,查找类型any
会给出一个空的答案,因为答案记录具有不是特定类型的答案any
。空的答案或失败的查找将返回空列表。
resolve/*
使用相同的参数进行调用并对结果进行过滤,以便Opts
对这些函数进行描述。
resolve(Name, Class, Type) -> {ok, dns_msg()} | Error
resolve(Name, Class, Type, Opts) -> {ok, dns_msg()} | Error
resolve(Name, Class, Type, Opts, Timeout) ->
{ok, dns_msg()
} | Error
类型
解析指定名称的指定类型和类的DNS记录。返回的内容dns_msg()
可以使用访问函数进行检查inet_db
,如在章节中所述DNS Types
。
如果Name
是ip_address()
,则生成要查询的域名作为".IN-ADDR.ARPA."
IPv4地址的标准反向名称或".IP6.ARPA."
IPv6地址的名称。在这种情况下,你很可能想要使用Class = in
和Type = ptr
,但它不会自动完成。
Opts
覆盖相应的解析器选项。如果nameservers
指定了选项,则认为它是名称服务的完整列表,所以解析器选项将alt_nameserves
被忽略。但是,如果alt_nameserves
还为此功能指定了选项,则会使用该选项。
选项verbose
(或更确切地说{verbose,true}
)导致通过io:format/2
查询,回复重传等进行诊断打印输出,类似于实用程序(例如dig
和)nslookup
。
如果Opt
是任何原子,它将被解释为{Opt,true}
除非原子串开头"no"
,作出解释{Opt,false}
。例如,usevc
是别名{usevc,true}
,nousevc
是别名{usevc,false}
。
选项inet6
对此功能没有影响。你可能想要使用Type = a | aaaa
。
例
这个访问函数示例显示了如何从模块外部lookup/3
实现resolve/3
:
example_lookup(Name, Class, Type) ->
case inet_res:resolve(Name, Class, Type) of
{ok,Msg} ->
[inet_dns:rr(RR, data)
|| RR <- inet_dns:msg(Msg, anlist),
inet_dns:rr(RR, type) =:= Type,
inet_dns:rr(RR, class) =:= Class];
{error,_} ->
[]
end.
遗留函数
由于名称服务器/超时参数的烦人的双重含义,以及因为它们没有适合解析器选项列表的体面位置,所以不推荐使用它们。
出口
nslookup(Name, Class, Type) -> {ok, dns_msg()} | {error, Reason}
nslookup(Name, Class, Type, Timeout) ->
{ok, dns_msg()
} | {error, Reason}
nslookup(Name, Class, Type, Nameservers) ->
{ok, dns_msg()
} | {error, Reason}
类型
解析指定名称的指定类型和类的DNS记录。
nnslookup(Name, Class, Type, Nameservers) ->
{ok, dns_msg()
} | {error, Reason}
nnslookup(Name, Class, Type, Nameservers, Timeout) ->
{ok, dns_msg()
} | {error, Reason}
类型
解析指定名称的指定类型和类的DNS记录。