首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

inet_res

模块

inet_res

模块摘要

基本的DNS客户端。

描述

该模块执行DNS名称解析递归名称服务器。

另请参阅ERTS User's Guide: Inet Configuration有关如何为IP通信配置Erlang运行时系统以及如何通过定义'dns'查找方法来启用此DNS客户端的更多信息。DNS客户端然后作为解析功能的后端inet

即使该DNS客户端不用于节点中的正常名称解析,该DNS客户端也可以解析DNS记录。

这不是一个完整的解析器,只有依赖于要求可信的递归名称服务器的DNS客户端。

名称解析

使用UDP查询除非解析器选项usevctrue强制TCP查询。如果查询对于UDP来说太大,则使用TCP。对于常规DNS查询,512字节是大小限制。

当启用EDNS(解析器选项edns设置为EDNS版本(即,0而不是false))时,解析器选项udp_payload_size设置限制。如果名称服务器回复TC位设置(截断),表示答案不完整,则查询udp_payload_size如果启用了EDNS,Resolver选项还会将通告的大小设置为允许的最大回复大小,否则名称服务器将使用512字节的限制,如果回复较大,则会被截断,从而导致TCP请求。

对于UDP查询,解析器选项timeoutretry控制重传。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函数仅返回指定字段的值。

代码语言:javascript
复制
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

对上述类型有一个信息功能:

代码语言:javascript
复制
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

如果解析器选项inet6true,则查找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数据。如果成功,筛选出答案记录用正确的ClassType,并返回其数据字段的列表。因此,查找类型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

如果Nameip_address(),则生成要查询的域名作为".IN-ADDR.ARPA."IPv4地址的标准反向名称或".IP6.ARPA."IPv6地址的名称。在这种情况下,你很可能想要使用Class = inType = 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

代码语言:javascript
复制
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记录。

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com