http://blog.sina.com.cn/s/blog_49f761940100mjtj.html
192.168.2.153和192.168.2.100上的ERLANG 都是安装的 Sep 15, 2010 R14B
两个ERLANG节点位于不同的机器上时,它们之间的通讯要用到COOKIE,虽然两个.erlang.cookie文件的内容是一样的。但启动后得到的COOKIE却不一样,暂时没有找到原因,不过有变通办法。
先查192.168.2.153上节点的COOKIE,然后将192.168.2.100上节点的COOKIE设置成和192.168.2.153上的一致就可以了。
一、192.168.2.153上是LINUX系统。【注:tut18.erl 和 tut18.beam都位于目录/usr/local/erlang/bin 下】
[root@uxserver bin]# pwd
/usr/local/erlang/bin
[root@uxserver bin]# erl -sname ping
Erlang R14B (erts-5.8.1) [source] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.8.1
(ping@uxserver)1> erlang:get_cookie().
'CLRNKJGXMLQNTOIFLMMR'
(ping@uxserver)2> erlang:get_cookie().
'CLRNKJGXMLQNTOIFLMMR'
(ping@uxserver)3>
二、192.168.2.100上面是WINDOWS系统。【注:tut18.erl 和 tut18.beam都位于目录C:\Program Files\erl5.8.1\bin>下】
C:\Program Files\erl5.8.1\bin>erl -sname pong
Eshell V5.8.1
(pong@GE-001)1> erlang:get_cookie().
'DLQNWNFGBHYXQQQEVBID'
(pong@GE-001)2> erlang:set_cookie('pong@GE-001', 'CLRNKJGXMLQNTOIFLMMR').
true
(pong@GE-001)3> erlang:get_cookie().
'CLRNKJGXMLQNTOIFLMMR'
(pong@GE-001)4> c(tut18).
{ok,tut18}
(pong@GE-001)5> tut18:start(ping@uxserver).
<8844.45.0>
(pong@GE-001)6> Pong received ping
(pong@GE-001)6> Ping received pong
(pong@GE-001)6> Pong received ping
(pong@GE-001)6> Ping received pong
(pong@GE-001)6> Pong received ping
(pong@GE-001)6> Ping received pong
(pong@GE-001)6> Pong finished
(pong@GE-001)6> ping finished
(pong@GE-001)6>
这说明在192.168.2.100启动了192.168.2.153上的 ping进程!!!
三、tut18.erl的内容如下:
-module(tut18).
-export([start/1,
ping(0, Pong_Node) ->
ping(N, Pong_Node) ->
pong() ->
start(Ping_Node) ->
四、在192.168.2.153上面启动TCPDUMP抓包工具,抓到了 192.168.2.100---> 192.168.2.153的4369端口的包。
[root@uxserver ~]# tcpdump -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:28:50.414498 IP 192.168.2.100.4265 > 192.168.2.153.4369: S 1317665909:1317665909(0) win 65535 <mss 1460,nop,wscale 3,nop,nop,timestamp 0 0,nop,nop,sackOK>
15:28:50.431398 IP 192.168.2.100.4265 > 192.168.2.153.4369: . ack 696221286 win 32768
15:28:50.431632 IP 192.168.2.100.4265 > 192.168.2.153.4369: P 0:7(7) ack 1 win 32768
15:28:50.453136 IP 192.168.2.100.4265 > 192.168.2.153.4369: . ack 20 win 32765
15:28:50.453409 IP 192.168.2.100.4265 > 192.168.2.153.4369: F 7:7(0) ack 20 win 32765
五、把192.168.2.153上的 目录/usr/local/erlang/bin 下的tut18.beam删除。
六、192.168.2.153上,重新编译一下tut18.erl(就生成了tut18.beam)
[root@uxserver bin]# erl -sname ping
Erlang R14B (erts-5.8.1) [source] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.8.1
(ping@uxserver)1> c(tut18).
{ok,tut18}
(ping@uxserver)2> erlang:get_cookie().
'CLRNKJGXMLQNTOIFLMMR'
(ping@uxserver)3>
七、从192.168.2.100上又可以启动192.168.2.153上面的ping进程了!
//端口的使用
[root@uxserver bin]#
[root@uxserver bin]# echo test >> test.data
[root@uxserver bin]# cat test.data
test
test
[root@uxserver bin]# erl
Erlang R14B (erts-5.8.1) [source] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.8.1
1> {ok,{_,_,{Port,_}}}=file:open('test.data',[read,raw]).
{ok,{file_descriptor,prim_file,{#Port<0.575>,7}}}
2> erlang:port_info(Port).
[{name,"efile"},
3> erlang:port_set_data(Port,xyzuwjj).
true
4> erlang:port_get_data(Port).
xyzuwjj
5>