我按照了书#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?
答案 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