2台Mac电脑与Erlang之间的通信

时间:2017-04-29 06:12:07

标签: erlang

我按照了书#34;编程Erlang - Joe Armstrong"尝试使用Erlang在两台Mac电脑之间建立通信(第14章):

% file: kvs.erl
-module(kvs).
-export([start/0, store/2, lookup/1]).

start() -> register(kvs, spawn(fun() -> loop() end)).

store(Key, Value) -> rpc({store, Key, Value}).
lookup(Key) -> rpc({lookup, Key}).

rpc(Q) ->
  kvs ! {self(), Q},
  receive
    {kvs, Reply} ->
      Reply
  end.

loop() ->
  receive
    {From, {store, Key, Value}} ->
      put(Key, {ok, Value}),
      From ! {kvs, true},
      loop();
    {From, {lookup, Key}} ->
      From ! {kvs, get(Key)},
      loop()
  end.

设置 Mac 1(Mac Pro)并运行Erlang服务器:

$ sudo hostname this.is.macpro.com
$ hostname
this.is.macpro.com

$ ipconfig getifaddr en2
aaa.bbb.ccc.209

$ erl -name server -setcookie abcxyz
(server@this.is.macpro.com)> c("kvs.erl").
{ok,kvs}
(server@this.is.macpro.com)> kvs:start().
true
(server@this.is.macpro.com)> kvs:store(hello, world).
true
(server@this.is.macpro.com)> kvs:lookup(hello).
{ok,world}

我尝试使用IP和主机名从另一台Mac制作RPC,但获得{badrpc, nodedown}

设置 Mac 2(MacBook Pro)并尝试拨打Mac 1:

$ sudo hostname this.is.macbookpro.com
$ hostname
this.is.macbookpro.com

$ ipconfig getifaddr en2
aaa.bbb.ccc.211   # different IP

$ erl -name client -setcookie abcxyz
% try using the hostname of Mac 1 but failed
(client@this.is.macbookpro.com)> rpc:call('server@this.is.macpro.com', kvs, lookup, [hello]).
{badrpc, nodedown}

% try using the IP address of Mac 1 but failed
(client@this.is.macbookpro.com)> rpc:call('server@aaa.bbb.ccc.209', kvs, lookup, [hello]).  
{badrpc, nodedown}

如何设置我的Mac电脑并使其可用于使用Erlang的RCP?

1 个答案:

答案 0 :(得分:1)

使用-name时,您应该提供全名。您使用的语法是-sname。试试这个:

erl -name server@this.is.macpro.com -setcookie "abcxyz"

erl -name client@this.is.macbookpro.com -setcookie "abcxyz"

在这两种情况下,您还可以在@之后指定IP。

然后从一个节点连接到另一个节点:

net_kernel:connect_node('client@this.is.macbookpro.com').

这应该返回true。如果它返回false,那么你没有连接。您可以使用nodes().

(joe@teves-MacBook-Pro.local)3> net_kernel:connect_node('steve@Steves-MacBook-Pro.local').
true
(joe@teves-MacBook-Pro.local)4> nodes().
['steve@Steves-MacBook-Pro.local']

如果这不能解决问题,那么您可以检查两个系统上的epmd以确保它们已注册。

epmd -names