2012-03-02 55 views
0

为什么在调用start/0时该程序运行成功,但在致电run/0时不能运行?当我通过拨打run/0启动程序时,我从gen/tcp得到{error, closed}我应该总是在父进程中调用listen()吗?

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

回答

2

当您运行echo_server:start()时,shell将成为您打开的套接字的所有者。当启动函数返回时,套接字仍处于打开状态,因为shell仍处于活动状态。如果你故意崩溃你的shell(输入类似3 = 2的东西),套接字将关闭。

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

解决方法之一是让您的启动功能停留(例如,添加一个没有超时的接收)。

+0

谢谢,并为我迟到抱歉。好答案! – 2012-09-11 08:27:46

相关问题