[erlang-questions] Problems when running distributed pingpong

Jiansen He jiansenhe@REDACTED
Wed Oct 6 00:29:42 CEST 2010


Hi,

I'm new to Erlang.  I tried to run the distributed pingpong program which
could be found at http://www.erlang.org/doc/getting_started/conc_prog.html.
The program works well when I run it in two terminals on the same machine.
However, it doesn't work when I try to run it on two computers.  I posted my
testing result as follows.

on Machine1 (Mac OS X Version 10.6.4)
$ erl -sname pong
Erlang R14B (erts-5.8.1) [source] [smp:4:4] [rq:4] [async-threads:0] [hipe]
[kernel-poll:false]

Eshell V5.8.1  (abort with ^G)
(pong@REDACTED)1>

(pong@REDACTED)1> tut17:start_pong().
true

On Machine2 (Windows 7)
>werl -sname ping

Erlang R14B (erts-5.8.1) [smp:2:2] [rq:2] [async-threads:0]

Eshell V5.8.1 (abort with ^G)
(ping@REDACTED)1>

(ping@REDACTED)1> tut17:start_ping('pong@REDACTED').
<0.39.0>
(ping@REDACTED)2>


Nothing happened on both sides:(

=========

To find the problem, I opened another terminal on both machines.

on Windows
~>ping 95.175.140.5

Pinging 95.175.140.5 with 32 bytes of data:
Reply from 95.175.140.5: bytes=32 time=4ms TTL=64
Reply from 95.175.140.5: bytes=32 time=1ms TTL=64
Reply from 95.175.140.5: bytes=32 time=34ms TTL=64
Reply from 95.175.140.5: bytes=32 time=10ms TTL=64

Ping statistics for 95.175.140.5:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 1ms, Maximum = 34ms, Average = 12ms


on Mac
dyn-95-175-140-5:~ $ ping -c4 95.175.140.3
PING 95.175.140.3 (95.175.140.3): 56 data bytes
64 bytes from 95.175.140.3: icmp_seq=0 ttl=128 time=1.491 ms
64 bytes from 95.175.140.3: icmp_seq=1 ttl=128 time=0.388 ms
64 bytes from 95.175.140.3: icmp_seq=2 ttl=128 time=0.399 ms
64 bytes from 95.175.140.3: icmp_seq=3 ttl=128 time=0.811 ms

--- 95.175.140.3 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.388/0.772/1.491/0.449 ms

So, those two machines are connected to the same Ethernet and they can ping
each other.  I turned off the firewall but the program still doesn't work:(

========
To find more information about my network, I reopen the erlang system on Mac
with -name option
(pong@REDACTED)1>
inet:gethostbyaddr('95.175.140.5').
{ok,{hostent,"dyn-95-175-140-5.chaledi.unite.inuknetworks.com",
             ["5.140.175.95.in-addr.arpa"],
             inet,4,
             [{95,175,140,5}]}}
(pong@REDACTED)2>
net_adm:dns_hostname('dyn-95-175-140-5').
{ok,"dyn-95-175-140-5"}
(pong@REDACTED)3> net_adm:dns_hostname('
dyn-95-175-140-5.inuknetworks.com').
{ok,"dyn-95-175-140-5.inuknetworks.com"}
(pong@REDACTED)4> net_adm:dns_hostname('
dyn-95-175-140-3.inuknetworks.com').
{error,'dyn-95-175-140-3.inuknetworks.com'}

Then I open erlang system on Windows with -name option...

On Mac
(pong@REDACTED)5>
inet:gethostbyaddr('95.175.140.3').
{ok,{hostent,"dyn-95-175-140-3.chaledi.unite.inuknetworks.com",
             ["3.140.175.95.in-addr.arpa"],
             inet,4,
             [{95,175,140,3}]}}
(pong@REDACTED)6>
net_adm:dns_hostname('dyn-95-175-140-3').
{ok,"dyn-95-175-140-19"}
(pong@REDACTED)7> net_adm:dns_hostname('
dyn-95-175-140-3.inuknetworks.com').
{ok,"dyn-95-175-140-3.inuknetworks.com"}
(pong@REDACTED)8> net_adm:dns_hostname('
dyn-95-175-140-3.chaledi.unite.inuknetworks.com').
{ok,"dyn-95-175-140-3.chaledi.unite.inuknetworks.com"}

It is clear that the erlang system could only recognize another host where
anthor erlang system is running.  And, more importantly, I get host names
that is known by my local DNS server.

On Mac
(pong@REDACTED)8> erlang:get_cookie().
'erlang_cookie'

On windows
(ping@REDACTED)1> erlang:get_cookie().
'erlang_cookie'

It shows that the magic cookies are set correctly on both machines.

on Mac
(pong@REDACTED)9> pingpong:start_pong().
true
(pong@REDACTED)10> net_adm:ping('
pong@REDACTED').
pong
(pong@REDACTED)11> net_adm:ping('
pong@REDACTED').
pang
(pong@REDACTED)12>
net_adm:localhost().                "dyn-95-175-140-3.inuknetworks.com"

It suggests that I should use hostname that has the form
'nodeName@REDACTED*.inuknetworks.com'

on Windows
(ping@REDACTED)2> net_adm:ping('
pong@REDACTED').
pang

To summarize.  my two computers are connected to the same Ethernet.  The
only difference between two IP addresses is the last digit.  Firewalls are
closed on both machines.  Computers can ping each other from the outside of
Erlang system.  Inside the Erlang system, one machine could have at least 3
valid host names from DNS server's point of view.  However, only one of them
is valid for net_adm:ping/1, if Erlang is invoked with -name option.  An
Erlang system could detect another host where another Erlang system is
running.  Somehow, an Erlang system cannot communicate with an Erlang node
in another Erlang system.

Any suggestions?


Jiansen


More information about the erlang-questions mailing list