2016-03-03 75 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節點通信。 –