2台Mac计算机与Erlang之间的通信

2台Mac计算机与Erlang之间的通信,erlang,Erlang,我遵循《编写Erlang-Joe Armstrong程序》一书,尝试在两台Mac电脑与Erlang之间建立通信(第14章): %文件:kvs.erl -模块(kvs)。 -导出([开始/0,存储/2,查找/1])。 start()->寄存器(kvs,spawn(fun()->loop()end))。 store(Key,Value)->rpc({store,Key,Value})。 查找(键)->rpc({lookup,Key})。 rpc(Q)-> kvs!{self(),Q}, 接收 {kv

我遵循《编写Erlang-Joe Armstrong程序》一书,尝试在两台Mac电脑与Erlang之间建立通信(第14章):

%文件:kvs.erl
-模块(kvs)。
-导出([开始/0,存储/2,查找/1])。
start()->寄存器(kvs,spawn(fun()->loop()end))。
store(Key,Value)->rpc({store,Key,Value})。
查找(键)->rpc({lookup,Key})。
rpc(Q)->
kvs!{self(),Q},
接收
{kvs,回复}->
回复
终止
循环()->
接收
{From,{store,Key,Value}}->
put(键,{ok,Value}),
从…起{kvs,true},
loop();
{From,{lookup,Key}}->
从…起{kvs,get(Key)},
循环()
终止
设置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?

使用th
-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,则表示您未连接。您可以使用
节点()。

(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