【问题标题】:Should I always call listen() in the parent process?我应该总是在父进程中调用 listen() 吗?
【发布时间】:2012-03-20 21:17:36
【问题描述】:

为什么调用start/0时程序运行成功,调用run/0时运行不成功?当我通过调用run/0 启动程序时,我从gen/tcp 得到{error, closed}

-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.

【问题讨论】:

    标签: sockets erlang listen


    【解决方案1】:

    当您运行 echo_server:start() 时,shell 将成为您打开的套接字的所有者。当 start 函数返回时,套接字仍然打开,因为 shell 还活着。如果您故意使 shell 崩溃(输入类似 3=2 的内容),套接字将关闭。

    另一方面,

    echo_server:run() 会启动一个拥有套接字的新进程。当 start 返回并且新进程退出时,套接字将关闭。

    一种解决方案是让您的 start 函数保持不变(例如,添加一个没有超时的接收)。

    【讨论】:

    • 谢谢你,很抱歉我迟到了。好答案!
    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 2011-01-24
    相关资源
    最近更新 更多