2012-03-02 14 views
0

start/0を呼び出すとこのプログラムは正常に実行されますが、run/0には呼び出されません。 run/0を呼び出してプログラムを起動すると、{error, closed}gen/tcpになります。親プロセスで常に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()を実行すると、シェルは開いたソケットの所有者になります。 start関数が返ってくると、シェルはまだ生きているのでソケットはまだ開いています。意図的にシェルをクラッシュさせると(3 = 2のようなものを入力してください)、ソケットは閉じます。

echo_server:run()は、ソケットを所有する新しいプロセスを開始します。 startが返って新しいプロセスが終了すると、ソケットは閉じられます。

1つの解決策は、タイムアウトなしで受信を追加するなど、スタート機能を利用することです。

+0

ありがとうございました。後で申し訳ありません。いい答えだ! –

関連する問題