Должен ли я всегда вызывать listen () в родительском процессе? - PullRequest
0 голосов
/ 02 марта 2012

Почему эта программа успешно работает при вызове start/0, а не при вызове run/0?Когда я запускаю программу, вызывая run/0, я получаю {error, closed} из gen/tcp.

-module(echo_server).
-compile(export_all).
run() ->
    spawn(fun() -> start() end).
start() ->
    {ok, Listen} = gen_tcp:listen(12345, [binary,{packet,0},
                                         {reuseaddr,true},
                                         {active, true}]),
spawn(fun() -> par_connect(Listen) end).
par_connect(Listen) ->
    {ok,Socket} = gen_tcp:accept(Listen),       
    spawn(fun() -> par_connect(Listen) end ),
    loop(Socket).
loop(Socket) ->
    receive
        {tcp,Socket,Bin} =Msg ->
            io:format("received ~p~n",[Msg]),
            gen_tcp:send(Socket,Bin),
            loop(Socket);
        Any ->
            io:format("any other received ~p~n",[Any]),
            gen_tcp:close(Socket)
    end.

1 Ответ

2 голосов
/ 03 марта 2012

когда вы запускаете echo_server: start (), оболочка становится владельцем открываемого вами сокета.когда функция запуска возвращается, сокет все еще открыт, потому что оболочка все еще жива.если вы намеренно сломаете свою оболочку (введите что-то вроде 3 = 2), сокет закроется.

echo_server: run (), с другой стороны, запускает новый процесс, которому принадлежит сокет.когда запуск возвращается и этот новый процесс завершается, сокет закрывается.

одним из решений было бы сохранение функции запуска (например, добавление получения без таймаута).

...