【问题标题】:Communication between 2 Mac computers with Erlang两台 Mac 电脑之间使用 Erlang 进行通信
【发布时间】:2017-04-29 06:12:06
【问题描述】:

我按照“Programming Erlang — Joe Armstrong”一书尝试使用 Erlang(第 14 章)在两台 Mac 计算机之间建立通信:

% 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?

【问题讨论】:

    标签: erlang


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 2011-12-22
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多