Erlang客户端在服务器对客户端进行ping之前无法对服务器进行ping



问题

我有两个Erlang节点,两台计算机上各有一个。我用一个唯一的陷阱和相同的cookie启动每个节点。当我尝试从客户端到服务器进行net_adm:ping/1时,它总是超时,除非我第一次从服务器到客户端进行ping。

例如,在客户端上:

(client@client_machine)1> net_adm:ping(server@server_machine).
pang

然后在服务器上:

(server@server_machine)1> net_adm:ping(client@client_machine).
pong

然后再次从客户端:

(client@client_machine)2> net_adm:ping(server@server_machine).
pong

对于这两台机器上的所有入站和出站连接,我都允许erl.exe和werl.exe通过防火墙。我不能用-name向任何一个方向ping;我必须使用-sname。

问题

这仍然是防火墙问题还是已知的行为?如果是已知问题,解决方法是什么?服务器是否定期尝试ping任何可能的客户端?

首先,如果你从client_machine ping(通常的ping而不是erlang ping)server_machine,你会得到is alive吗?通常,当节点不在同一台计算机/服务器上时,需要使用-name和NOT -sname选项

如果这两台机器可以使用正常的ping看到彼此,则尝试使用机器的IP Adresses启动节点。比方说,client_machine = 192.168.100.2server_machine = 192.168.100.5,节点应该像这样启动:

#;erl-名称client@192.168.100.2-setcookie mycokie
#;erl-名称server@192.168.100.5-setcookie mycokie

然后做erlang ping,看看会发生什么。此外,由于您使用的是Resolvable names,即client_machine,如果您在UNIX / LINUX上,则需要在/etc/hosts中添加机器的IP地址和名称,或者至少使这两台机器使用相同的DNS服务器,该服务器可以解析这些名称。此外,当您阅读erlang的net_adm文档时,您会发现erlang也有/etc/hosts的等价物。

在仔细检查所有内容后,我发现:我在服务器上有防火墙规则,允许C:\Program Files\erl5.9.1\bin\erl.exe,但运行的是C:\Program Files\rl5.9.1\erts-5.9.1\bin\erl.exe。

我觉得错过了这样的东西很愚蠢,但我想我最好承认,这样其他人就可以从中受益:/

"客户端计算机"one_answers"服务器计算机"都可解析吗?您可以从命令行使用ping server_machine进行检查。

由于您在同一个物理实例上执行此操作,并且每个虚拟节点都有不同的sname,因此它们都应该是可访问的,例如,它们都在/etc/hosts(windows情况下为windows/system32/drivers/etc/hosts)中有记录

最新更新