我有两台使用LAN电缆连接的Linux机器。每台机器都可以ping另一台机器。 机器A在其以太网eth0上具有IP:192.168.137.1。 机器B在其以太网eth0上具有IP:192.168.137.2。
在机器A的终端上:
ping 192.168.137.2
返回回复,B上的Wireshark能够捕获传入的ping。
在机器B的终端上:
ping 192.168.137.1
返回回复,A上的Wireshark能够捕获传入的ping。
因此,我们在A和B之间有完全连接。
现在,我怎么能有两个Erlang shell,一个在A上运行而另一个在B上运行,能够互相ping /通话?如果有人可以通过提供详细的步骤来帮助我实现这一点,那就太好了。我一直在搜索论坛和浏览文档,但到目前为止,我还没有工作。我能找到的所有工作都是在同一台主机上的两个节点之间进行通信。
答案 0 :(得分:1)
正在运行的Erlang VM实例称为节点。如果启动Erlang shell,您将最终得到一个已禁用分发的节点。您可以通过调用title_txt <- "H:/Desktop/IST719/titles.txt"
titlefile <- scan(title_txt, character(0), sep = "\n")
head(titlefile)
title.vec <- VectorSource(titlefile)
title.corpus <- Corpus(title.vec)
title.corpus
title.corpus <- tm_map(title.corpus, content_transformer(tolower))
title.corpus <- tm_map(title.corpus, removePunctuation)
title.corpus <- tm_map(title.corpus, removeNumbers)
title.corpus <- tm_map(title.corpus, removeWords, stopwords("english"))
tdm <- TermDocumentMatrix(title.corpus)
tdm
m <- as.matrix(tdm)
函数来检查这一点。
is_alive/0
所有节点都有一个名称 - 即使是那些没有启用分发的节点:
$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3 (abort with ^G)
1> is_alive().
false
...并且由于分发已禁用,因此群集中没有节点(暂时):
2> node().
nonode@nohost
启用分发后,有几种通信方式:我们可以调用shell中的各种函数,让Erlang VM 在启动时自动处理它等。
3> nodes().
[]
4> q().
ok
注意:
$ erl -sname earth Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:10] [hipe] [kernel-poll:false] Eshell V9.3 (abort with ^G) (earth@uplink)1> is_alive(). true (earth@uplink)2> node(). earth@uplink (earth@uplink)3> nodes(). []
是我的计算机的名称。完整节点 名称始终为uplink
。您还可以看到提示与第一次/示例时的提示略有不同。
......但是,没有人连接!在另一台计算机上启动另一个节点,并将其命名为name@host
。
pluto
您现在已启动并运行Erlang群集。还有其他一些方法可以做到这一点。我建议你阅读Learn You Some Erlang for Great Good! ...非常好的。
重要提示:如果您没有相同的&#34; Cookie&#34;在两台机器中,您可能会很难尝试通信节点。相反,您可以启动节点并同时设置cookie:
$ erl -sname pluto Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:10] [hipe] [kernel-poll:false] Eshell V9.3 (abort with ^G) (pluto@uplink)1> is_alive(). true (pluto@uplink)2> node(). pluto@uplink (pluto@uplink)3> nodes(). [] (pluto@uplink)4> net_adm:ping(earth@uplink). pong (pluto@uplink)5> nodes(). [earth@uplink]
。
答案 1 :(得分:1)
我正面临着与您相同的情况,因为我需要在网络中的其他主机上部署Erlang,所以让我在这里分享我如何进行修复。
我有02个虚拟机:
第一个虚拟机:
ip:10.57.63.165
第二个虚拟机:
ip:10.57.63.163
正如您在下面看到的,他们可以彼此ping通:
我们已经知道,02 Erlang Node需要共享相同的Erlang Cookie。
对于此解决方案,我将跳过 .erlang.cookie 文件;我将为临时目的手动设置erlang cookie( -setcookie ):
如您所见:
我们碰到了庞。
不允许连接,因为我弄错了我的erlang cookie(应该是相同的)。
让我们重试(具有 正确的cookie值 ):
万岁,我们得到了 Pong 。
02个Erlang群集已启动。
您会看到,当我运行nodes()时,它将在serveur @ ggsn节点上返回client @ sgsn,反之亦然。
诀窍是什么:
不幸的是,我们不能仅使用Erlang来做所有事情。
我需要 编辑/ etc / hosts 文件,如下所示:
(我假设如果我们在拓扑中使用DNS,则根本不需要编辑/ etc / hosts。)
希望有帮助。
答案 2 :(得分:0)
我认为Throw Away Account's comment令人耳目一新:这主要是一个网络问题,并且这个问题(在Stackoverflow和其他站点上)有很多重复之处,似乎证明了这一点(大多数情况下其中没有答案):
基于这些链接,似乎只有在网络设置微不足道时(机器位于同一子网中,并且它们运行相同的网络堆栈),事情才似乎开箱即用。否则,我会认为需要正确设置DNS,需要使用SSH隧道等,但不确定如何。
将其发布为社区Wiki,是因为(1)并不是真正的答案,并且(2)希望有更多知识的人会提供一些指导。 (或者提供一个独立的答案,随便什么。)