查看源代码 erl_epmd (kernel v10.2)
Erlang 与 epmd 的接口
此模块与 EPMD 守护进程通信,请参阅 epmd。要实现您自己的 epmd 模块,请参阅 ERTS 用户指南:如何为 Erlang 分布实现备用节点发现
摘要
函数
由分布模块调用,将 Host
解析为远程节点的 IP 地址。
由分布模块调用,以获取本地节点在接受新的分布请求时应监听的端口。
由 net_adm:names/0
调用。 Host
默认为 localhost。返回在指定主机上 epmd
注册的 Erlang 节点的名称和关联的端口号。如果 epmd
未运行,则返回 {error, address}
。
请求 EPMD 实例中给定节点的分布端口。与端口一起,它返回一个分布协议版本,自 Erlang/OTP R6 以来一直是 5。
向 epmd
注册节点,并告知 epmd 当前节点将使用哪个端口。它返回一个创建编号。每次注册时,此数字都会递增,以帮助区分连接到 epmd 的同名新节点实例。
当此模块作为 erl_distribution
supervisor 的子节点添加时,会调用此函数。
函数
-spec address_please(Name, Host, AddressFamily) -> Success | {error, term()} when Name :: string(), Host :: string() | inet:ip_address(), AddressFamily :: inet | inet6, Port :: non_neg_integer(), Version :: non_neg_integer(), Success :: {ok, inet:ip_address()} | {ok, inet:ip_address(), Port, Version}.
由分布模块调用,将 Host
解析为远程节点的 IP 地址。
作为一种优化,此函数还可以返回远程节点的端口和版本。如果返回端口和版本,则不会调用 port_please/3
。
-spec listen_port_please(Name, Host) -> {ok, Port} when Name :: atom() | string(), Host :: atom() | string() | inet:ip_address(), Port :: non_neg_integer().
由分布模块调用,以获取本地节点在接受新的分布请求时应监听的端口。
-spec names(Host) -> {ok, [{Name, Port}]} | {error, Reason} when Host :: atom() | string() | inet:ip_address(), Name :: string(), Port :: non_neg_integer(), Reason :: address | file:posix().
由 net_adm:names/0
调用。 Host
默认为 localhost。返回在指定主机上 epmd
注册的 Erlang 节点的名称和关联的端口号。如果 epmd
未运行,则返回 {error, address}
。
示例
(arne@dunn)1> erl_epmd:names(localhost).
{ok,[{"arne",40262}]}
-spec port_please(Name, Host) -> {port, Port, Version} | noport | closed | {error, term()} when Name :: atom() | string(), Host :: atom() | string() | inet:ip_address(), Port :: non_neg_integer(), Version :: non_neg_integer().
-spec port_please(Name, Host, Timeout) -> {port, Port, Version} | noport | closed | {error, term()} when Name :: atom() | string(), Host :: atom() | string() | inet:ip_address(), Timeout :: non_neg_integer() | infinity, Port :: non_neg_integer(), Version :: non_neg_integer().
请求 EPMD 实例中给定节点的分布端口。与端口一起,它返回一个分布协议版本,自 Erlang/OTP R6 以来一直是 5。
-spec register_node(Name, Port) -> Result when Name :: string(), Port :: non_neg_integer(), Creation :: non_neg_integer(), Result :: {ok, Creation} | {error, already_registered} | term().
-spec register_node(Name, Port, Driver) -> Result when Name :: string(), Port :: non_neg_integer(), Driver :: inet_tcp | inet6_tcp | inet | inet6, Creation :: non_neg_integer() | -1, Result :: {ok, Creation} | {error, already_registered} | term().
向 epmd
注册节点,并告知 epmd 当前节点将使用哪个端口。它返回一个创建编号。每次注册时,此数字都会递增,以帮助区分连接到 epmd 的同名新节点实例。
节点成功向 epmd 注册后,如果连接断开,它将自动尝试重新连接到守护进程。
当此模块作为 erl_distribution
supervisor 的子节点添加时,会调用此函数。