erlang程序设计笔记

时间:2012-10-10     作者:smarteng     分类: 编程


第十章,10.1.3 让客户机和服务器运行于同一个局域网的不同机器上,

我在同一台机器上安装了一个ubuntu虚拟机来模拟一个局域网,

在这个虚拟机上启动节点: erl -name gandalf -setcookie abc

{error_logger,{{2012,10,10},{15,36,58}},"Can't set long node name!\nPlease check your configuration\n",[]}
{error_logger,{{2012,10,10},{15,36,58}},crash_report,[[{initial_call,{net_kernel,init,['Argument__1']}},{pid,<0.20.0>},{registered_name,[]},{error_info,{exit,{error,badarg},[{gen_server,init_it,6},{proc_lib,init_p_do_apply,3}]}},{ancestors,[net_sup,kernel_sup,<0.9.0>]},{messages,[]},{links,[<0.17.0>]},{dictionary,[{longnames,true}]},{trap_exit,true},{status,running},{heap_size,2584},{stack_size,24},{reductions,918}],[]]}
{error_logger,{{2012,10,10},{15,36,58}},supervisor_report,[{supervisor,{local,net_sup}},{errorContext,start_error},{reason,{'EXIT',nodistribution}},{offender,[{pid,undefined},{name,net_kernel},{mfargs,{net_kernel,start_link,[[gandalf,longnames]]}},{restart_type,permanent},{shutdown,2000},{child_type,worker}]}]}
{error_logger,{{2012,10,10},{15,36,58}},supervisor_report,[{supervisor,{local,kernel_sup}},{errorContext,start_error},{reason,shutdown},{offender,[{pid,undefined},{name,net_sup},{mfargs,{erl_distribution,start_link,[]}},{restart_type,permanent},{shutdown,infinity},{child_type,supervisor}]}]}
{error_logger,{{2012,10,10},{15,36,58}},std_info,[{application,kernel},{exited,{shutdown,{kernel,start,[normal,[]]}}},{type,permanent}]}
{"Kernel pid terminated",application_controller,"{application_start_failure,kernel,{shutdown,{kernel,start,[normal,[]]}}}"}

Crash dump was written to: erl_crash.dump
Kernel pid terminated (application_controller) ({application_start_failure,kernel,{shutdown,{kernel,start,[normal,[]]}}})


一堆的错误呀,一番查找之后,伟大的google给了答案:

http://topic.csdn.net/u/20081119/23/3c4402c2-0b7d-49ef-aee7-398bf1c083d4.html

原因是我的主机没有域名,因此只能用-sname,也就是短名的形式来启动节点。

我的解决方法是,在本机上装了个2003 Server的虚拟机,建立域控制器,把本机加入到一个域中就可以了。

然后就可以通过erl -name mynode -setcookie abc建立分布式Erlang结点。

但是要想其他节点(假设这个节点叫othernode,运行在局域网上另外的机器上)通过rpc:call调用mynode上的进程,则需要DNS支持。

如果没有DNS,这个也好解决,修改othernode所在主机的C:\WINDOWS\system32\drivers\etc下的hosts文件,进行本地解析就可以了

当然,以上方法是在个人的局域网上做测试时采用的,如果你的机器本身有域名,并且可以通过DNS进行解析的话,以上问题是不会遇到的!

知道答案就好说了,得把这个节点加入域,

又google找到了ubuntu加入域:

安装 likewise-open 到 Ubuntu 

sudo aptitude install likewise-open-gui

使用图形连接:

点击 Applications -> Internet -> Likewise to join my computer to an active directory domain

在设置里输入域名称,域登陆帐号。点加入就行了。

使用命令行连接:

sudo domainjoin-cli join fqdn.of.your.domain Administrator

sudo update-rc.d likewise-open defaults

sudo /etc/init.d/likewise-open start

之后,修改/etc/resolv.conf  

nameserver 127.0.0.1

#search localdomain

search i.****.com 

之后启动节点,就ok了,

测试书上所说的代码,

还得在windows启动一个节点,当然 -setcookie得一致,

修改hosts文件 

192.168.240.128 ubuntu.****.com

开始测试吧~