问题
我有两个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.2
而server_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)中有记录