我试图在Erlang中使用分发编程。
但我遇到了问题,我无法通知两个Erlang的节点进行通信。
我试图将相同的原子放在" Magical cookies"中,但它没有用。
我尝试使用命令net:ping(节点),但响应是pang(没有重新启动另一个节点),或者使用nodes(),看看我的第一个节点是否看到了第二个节点,但它没有&再次工作。
第一个和第二个节点是VMWare中的CentOS,使用网络适配器中的桥接连接。
我在VM之间在Erlang之外输入命令ping,并且他们重新协调每个命令。
我启动了第一个节点,但第二个节点打开了进程,但无法找到节点pong。
(pong@localhost)8> tut17:start_pong().
true
(ping@localhost)5> c(tut17).
{ok,tut17}
(ping@localhost)6> tut17:start_ping(pong@localhost).
<0.55.0>
谢谢!
答案 0 :(得分:1)
分发由名为Erlang Port Mapper Daemon的守护程序提供。默认情况下,它侦听端口4369,因此您需要确保在节点之间打开该端口。此外,每个启动的Erlang VM都会打开一个额外的端口来与其他VM通信。您可以使用epmd -names
:
g@someserv1:~ % epmd -names
epmd: up and running on port 4369 with data:
name hbd at port 22200
您可以通过对telnet
进行打开来检查端口是否已打开,例如:
g@someserv1:~ % telnet 127.0.0.1 22200
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
^]
Connection closed by foreign host.
您可以将端口更改为要检查的端口,例如4369,以及所需IP的IP。执行ping
是不够的,因为它使用自己的ICMP protocol,这与Erlang发行版用于通信的TCP不同,例如可能允许使用ICMP,但TCP可能会被阻止。
修改强>
请按照本指南Distributed Erlang以分布式模式启动Erlang VM。然后,您可以使用net_adm:ping/1
从另一个节点连接到它,例如:
(hbd@someserv1.somehost.com)17> net_adm:ping('hbd@someserv2.somehost.com').
pong
只有epmd -names
才会在列表中显示已启动的Erlang VM。
<强> EDIT2:强>
假设有主机A和B.每个主机运行一个Erlang VM。 epmd -names
在每个主机上运行,例如:
主持人A:
epmd: up and running on port 4369 with data:
name servA at port 22200
主持人B:
epmd: up and running on port 4369 with data:
name servB at port 22300
您需要能够:
在主持人A:
telnet HostB 4369
telent HostB 22300
主持人B:
telnet HostA 4369
telnet HostA 22200
其中HostA和HostB是这些主机的IP地址(例如,HostA是主机A的IP,HostB是主机B的IP)。
如果telnet工作正常,那么您应该可以从一个主机到另一个主机执行net_adm:ping/1
,例如在主机A上,您将ping主机B的名称。该名称是命令node().
返回的内容。
答案 1 :(得分:1)
您需要确保节点具有节点名称,否则它们无法连接。 E.g:
erl -sname somenode@node1
如果您正在使用单独的主机,那么您需要确保节点名称可以以某种方式解析为IP地址。一个简单的方法是使用/ etc / hosts。
# Append a similar line to the /etc/hosts file
10.10.10.10 node1
要获得更多有用的答案,您应该在尝试时发布您在终端中看到的内容。
修改强>
看起来你的shell是自动选择&#34; localhost&#34;作为节点名称。您无法使用地址&#34; localhost&#34;将消息发送到另一台主机。在shell上指定名称时,请尝试使用@语法指定节点名称:
# On host 1:
erl -sname ping@host1
# On host 2
erl -sname pong@host2
然后编辑主机文件,以便host1和host2解析为正确的IP。