ERLANG远程启动进程终于成功!!!

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  (abort with ^G)
(
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  (abort with ^G)
(
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/2, pong/0]).
ping(0, Pong_Node) ->
    {pong, Pong_Node} ! finished,
    io:format("ping finished~n", []);
ping(N, Pong_Node) ->
    {pong, Pong_Node} ! {ping, self()},
    receive
        pong ->
            io:format("Ping received pong~n", [])
    end,
    ping(N - 1, Pong_Node).
pong() ->
    receive
        finished ->
            io:format("Pong finished~n", []);
        {ping, Ping_PID} ->
            io:format("Pong received ping~n", []),
            Ping_PID ! pong,
            pong()
    end.
start(Ping_Node) ->
    register(pong, spawn(tut18, pong, [])),
    spawn(Ping_Node, tut18, ping, [3, node()]).

 

 

四、在192.168.2.153上面启动TCPDUMP抓包工具,抓到了 192.168.2.100---> 192.168.2.153的4369端口的包。


[root@uxserver ~]# tcpdump -i eth0  dst port 4369
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.100上就启动不了192.168.2.153上面的ping进程了!。

 

六、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  (abort with ^G)
(
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  (abort with ^G)
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"},
 {links,[<0.32.0>]},
 {id,575},
 {connected,<0.32.0>},
 {input,9},
 {output,15}]
3> erlang:port_set_data(Port,xyzuwjj).
true
4> erlang:port_get_data(Port).
xyzuwjj
5>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值