Я новичок в эрланге.Я не могу понять, почему моя программа не работает.Помогите мне, пожалуйста.
server() ->
io:format("server ~n"),
register( doServer, Pid = spawn(node(), ?MODULE, doServer,[[]])),
io:format("server ~p ~n", [registered()]).
client() ->
io:format("client ~p ~n", [registered()]),
spawn_clients(1).
Сервер регистрируется (атом, PID)
register( doServer, Pid = spawn(node(), ?MODULE, doServer,[[]])),
erlc smplMessenger.erl ; echo " ****** RUN *******"; \
erl -noshell -sname p1 +v setcookie k1 -s smplMessenger server
****** RUN *******
server
server [code_server,erl_prim_loader,application_controller,kernel_safe_sup,
standard_error_sup,inet_db,init,erts_code_purger,user,***doServer***,
error_logger,rex,kernel_sup,erl_signal_server,global_name_server,
standard_error,global_group,file_server_2]
Start server
В печати "зарегистрирован ()."Я вижу псевдоним " doServer "
Но клиент не может видеть псевдоним " doServer " и его PID
erl -noshell setcookie k1 -sname p2 -s smplMessenger client
Erlang/OTP 20 [erts-9.3] [source] [smp:2:2] [ds:2:2:10] [async-threads:10] [hipe] [kernel-poll:false]
client [code_server,erl_prim_loader,application_controller,erl_epmd,auth,
standard_error_sup,net_kernel,inet_db,init,erts_code_purger,user,
error_logger,rex,net_sup,kernel_sup,user_drv,kernel_safe_sup,
erl_signal_server,global_name_server,standard_error,global_group,
file_server_2]
[Client <0.5.0>] node 1 spawned
All client spawned
[Client <0.67.0> 1] Start client with serv pid undefined. Im alive
=ERROR REPORT==== 31-May-2018::21:52:07 ===
Error in process <0.67.0> on node p2@station with exit value:
{badarg,[{smplMessenger,doClient,1,[{file,"smplMessenger.erl"},{line,121}]}]}
, строка 121 -
118: doClient(Name) ->
119: io:format("[Client ~p ~p] Start client with serv pid ~p. Im alive ~n",
120: [self(), Name, whereis(doServer)]),
121: doServer ! {isAlive, self(), Name},
121:
122: clientRecv(Name),
123:
124: io:format("[Client ~p ~p] FINISH CLIENT ~n",
125: [self(), Name]).
Я запускаю два узла с одного компьютера (Кук в двух узлах равен).
epmd, см. Процессы клиента и сервера.
Узел 1 и узел 2 могут пропинговать оба.
netstat -tuwpln
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN 1408/epmd
tcp 0 0 0.0.0.0:36499 0.0.0.0:* LISTEN 3008/beam.smp
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:33865 0.0.0.0:* LISTEN 3047/beam.smp
tcp6 0 0 :::4369 :::* LISTEN 1408/epmd
tcp7 0 0 ::1:631 :::* LISTEN -
Где я не прав?Помоги мне.
Я изменяю регистр на глобальный, но клиентский процесс ничего не видит на сервере (doServer).
server() ->
io:format("server ~n"),
global:register_name( doServer, spawn(node(), ?MODULE, doServer,[[]])),
io:format("server ~p ~n", [global:registered_names()]).
client() ->
io:format("[Client ~p ] ~p ~n",
[self(), global:whereis_name(doServer)]),
io:format("client ~p ~n", [global:registered_names()]).
erlc smplMessenger.erl ; echo " ****** RUN *******"; erl -noshell -sname p1 -v -setcookie k1 -s smplMessenger server
****** RUN *******
server
Start server
server [doServer]
erlc smplMessenger.erl ; echo " ****** RUN *******"; erl -noshell -sname p2 -v -setcookie k1 -s smplMessenger client
****** RUN *******
[Client <0.5.0> ] undefined
client []