问题描述
很多同学误会了epmd的作用,认为epmd就是erlang集群的协议,我来澄清下:Epmd是Erlang Port Mapper Daemon的缩写,在Erlang集群中的作用相当于dns的作用,提供节点名称到端口的查询服务,epmd绑定在总所周知的4369端口上。epmd文档:这里epmd协议:这里Erlang的节点名称是类似这样的foo@ip的格式,当一个节点启动的时候,首先会在本机启动epmd,同时把自己的节点名称和节点监听的tcp端口登记在上面。看代码:// erlexec.c02 03...04 05case 'n':06 07 if (strcmp(argv, "-name") == 0) { /* -name NAME */08 09 if (i+1 >= argc)10 11 usage("-name");12 13 14 15 /* 16 17 * Note: Cannot use add_args() here, due to non-defined 18 19 * evaluation order. 20 21 */22 23 24 25 add_arg(argv);26 27 add_arg(argv);28 29 isdistributed = 1;30 31 i++;32 33...34 35case 's': /* -sname NAME */36 37 if (strcmp(argv, "-sname") == 0) {38 39 if (i+1 >= argc)40 41 usage("-sname");42 43 add_arg(argv);44 45 add_arg(argv);46 47 isdistributed = 1;48 49 i++;50 51 }52 53...54 55 if (isdistributed && !no_epmd)56 57 start_epmd(epmd_prog);58 59...我们可以透过erl -epmd EPMD_PROG来传入不同的参数。再**实验:$erl -sname a02 03$erl -sname b04 05$erl -sname c06 07$ ps -ef|grep epmd08 09membase 4592 1 0 Aug25 ? 00:00:39 /usr/local/bin/epmd -daemon10 11...12 13$ netstat -an|grep 436914 15tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN 16 17$ epmd -names18 19epmd: up and running on port 4369 with data:20 21name c at port 409622 23name b at port 409724 25name a at port 409826 27...28 29$erl -sname x30 31Erlang R14B04 (erts-5.8.5) 1 32 33 34 35Eshell V5.8.5 (abort with ^G)36 37(x@my031091)1> erl_epmd:port_please(x, "127.0.0.1").38 39{port,34625,5}40 41 42 43(x@my031091)2> erl_epmd:names().44 45{ok,}epmd是个标准的tcp服务器,它的协议如下: