Erlang 为什么net_内核:monitor_nodes/2不为sname节点传递nodeup/nodedown消息?

Erlang 为什么net_内核:monitor_nodes/2不为sname节点传递nodeup/nodedown消息?,erlang,distributed-system,Erlang,Distributed System,我用一个短名称启动一个主节点,并让它运行一个进程来监视节点的启动和关闭消息 > erl -sname master -cookie monster Erlang R15B03 (erts-5.9.3) [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false] [dtrace] Eshell V5.9.3 (abort with ^G) (master@pencil)1> c("/tmp/mon

我用一个短名称启动一个主节点,并让它运行一个进程来监视节点的启动和关闭消息

> erl -sname master -cookie monster
Erlang R15B03 (erts-5.9.3) [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false] [dtrace]

Eshell V5.9.3  (abort with ^G)
(master@pencil)1> c("/tmp/monitor.erl").
{ok,monitor}
(master@pencil)2> Pid = monitor:start().
<0.44.0>
(master@pencil)3> Pid ! running.
RECV :: running
running
(master@pencil)4> net_adm:names().
{ok,[{"master",52564}]}
等一下,以防万一我看错了文件,净滴答率出现了问题。没什么,所以主人我强制连接:

(master@pencil)5> net_adm:names().
{ok,[{"master",52564},{"client",52579}]}
(master@pencil)6>
我的小监视器里什么都没有。现在,如果我做同样的事情,但是使用长名称——也就是
-name
——这很好。不过,我很惊讶,
netu内核
docs没有提到这一点。怎么回事


这是上面提到的
monitor.erl

-module(monitor).

-export([start/0]).

start() ->
    spawn_link(fun init_loop/0).

%%%===================================================================
%%% Internal Functions
%%%===================================================================

init_loop() ->
    net_kernel:monitor_nodes(true, []),
    loop().

loop() ->
    receive
    Msg -> io:format(user, "RECV :: ~p~n", [Msg])
    end,
    loop().
确实为具有短名称和长名称的节点提供nodeup/nodedown消息

但是,如文档中所述,
nodeup
消息仅在节点连接时发送。为什么您收到带有
-name
nodeup
消息是个谜(此处无法复制),因为
net\u adm:names/0
根本不连接节点。它仅连接到epmd以获取本地注册节点的列表。它甚至会列出具有不同cookie的节点

如果使用
net\u adm:ping/1
(或
rpc
调用)将客户端连接到主机(或其他方式),则监视进程将收到
nodeup
消息

-module(monitor).

-export([start/0]).

start() ->
    spawn_link(fun init_loop/0).

%%%===================================================================
%%% Internal Functions
%%%===================================================================

init_loop() ->
    net_kernel:monitor_nodes(true, []),
    loop().

loop() ->
    receive
    Msg -> io:format(user, "RECV :: ~p~n", [Msg])
    end,
    loop().