2016-03-03 76 views
0

我正尝试在Erlang中使用分发编程。Erlang - 节点不识别

但是我有一个问题,我不能通信的两个Erlang的节点进行通信。

我试图把同样的原子在“魔法饼干”,但没有奏效。

我试图使用命令net:ping(节点),但是响应是庞(没有重新配置另一个节点)或使用节点()来查看我的第一个节点是否看到第二个节点,再次工作。

第一和第二节点是CentOS的在VMWare,使用在网络适配器桥连接。

我输入命令:ping二郎外虚拟机之间以及它们reconigze各一个。

我开始了第一个节点,但第二点开放的过程,但找不到节点乒乓球。

([email protected])8> tut17:start_pong(). 
true 


([email protected])5> c(tut17). 
{ok,tut17} 
([email protected])6> tut17:start_ping([email protected]). 
<0.55.0> 

谢谢!

+1

你将需要提供一些代码和上下文来帮助你做些什么。 – Suever

+0

你检查过防火墙配置和路由器吗? – Pascal

+0

你可以从两个节点发布'epdm -names'吗? – Amiramix

回答

1

A similar question here

的分布是由一种叫做Erlang Port Mapper Daemon守护程序提供。默认情况下,它侦听端口4369,因此您需要确保该端口在节点之间打开。另外,每个启动的Erlang虚拟机都会打开一个额外的端口与其他虚拟机进行通信。你可以看到这些端口与epmd -names

[email protected]:~ % epmd -names 
epmd: up and running on port 4369 with data: 
name hbd at port 22200 

您可以检查该端口是否被做telnet它打开,如:

[email protected]:~ % 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从另一个节点连接到它,例如:

([email protected])17> net_adm:ping('[email protected]'). 
pong 

只有这样epmd -names会显示启动二郎VM名单上。

EDIT2:

假设有寿主机A和B每一个运行一个虚拟机二郎。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地址(主机A .e.g是主机A的IP,主机B是主机B的IP)。

如果telnet工作正常,那么你应该可以从一台主机到另一台主机执行net_adm:ping/1,例如,在主机A上,您可以ping主机B的名称。名称是命令node().返回的内容。

+0

我编辑了答案,添加了如何正确启动VM节点的信息。除非知道虚拟机,否则'epmd -names'不会显示虚拟机,例如虚拟机已启动并可以连接到该虚拟机。请阅读指南,了解分发工作的方式,简而言之,Erlang虚拟机尝试与'epmd'通信以注册它并发现其他节点。然后它为每个虚拟机创建一个新的端口,它可以通过“epmd”成功连接。 – Amiramix

+0

是的,我之前遵循了这个指南,但它没有奏效。 '[erlang @ localhost〜] $ epmd -names epmd:启动并在端口4369上运行数据:'我只有一个端口4369.我将我的cookie设置为同一个原子,但我的节点不连接。 –

+0

不能有多个端口4369.'epmd'在4369上运行,每个新启动的VM都有自己的端口。在启动虚拟机时,你是如何启动虚拟机和参数的?当你在Erlang shell中执行'node().'时,你会得到什么? – Amiramix

1

您需要确保您的节点有节点名称,否则它们将无法连接。例如: -

erl -sname [email protected] 

如果您使用不同的主机,那么你需要确保节点名称解析以某种方式的IP地址。一个简单的方法是使用/ etc/hosts。

# Append a similar line to the /etc/hosts file 
10.10.10.10 node1 

对于更多有用的答案,您应该在您尝试此操作时发布您在终端中看到的内容。


编辑

它看起来像你的shell是自动选择 “localhost” 作为节点名称。您不能将消息发送到地址为“localhost”的另一台主机。当在外壳指定名称,请尝试使用@语法指定节点名称,以及:

# On host 1: 
erl -sname [email protected] 

# On host 2 
erl -sname [email protected] 

然后编辑主机文件,以便host1和host2将解决向右IP。

+0

我编辑了我的问题,我正在尝试使用来自Erlang quickstart的教程ping pong。节点pong启动成功,但节点ping无法与Pong节点通信。 –