2013-03-24 63 views
2

在shell中運行的服務器掛起並且無法接受任何輸入。有沒有辦法讓程序允許輸入,同時仍然運行服務器循環來接受傳入連接?Erlang:服務器光標掛在命令行上?

-module(cp1). 
-export([start/0,accept/1,enter_loop/1,loop/1]). 

start() -> 

    io:format("Started Server:~n"), 
    {ok, Socket} = gen_tcp:listen(4001, [binary, {packet, 0},{reuseaddr, true},{active, false}]), 
    accept(Socket). 

accept(ListenSocket) -> 
    case gen_tcp:accept(ListenSocket) of 
     {ok, Socket} -> 
      Pid = spawn(fun() -> 
       io:format("Connection accepted ~n", []), 
       enter_loop(Socket) 
      end), 
      io:format("Pid ~p~n",[Pid]), 
      gen_tcp:controlling_process(Socket, Pid), 
      Pid ! ack, 
      accept(ListenSocket); 
     Error -> 
      exit(Error) 
    end. 

enter_loop(Sock) -> 
    %% make sure to acknowledge owner rights transmission finished 
    receive ack -> ok end, 
    loop(Sock). 

loop(Sock) -> 
    %% set soscket options to receive messages directly into itself 
    inet:setopts(Sock, [{active, once}]), 
    receive 
     {tcp, Socket, Data} -> 
      io:format("Got packet: ~p~n", [Data]), 
      io:format("Send packet: ~p~n",[Data]), 
      gen_tcp:send(Socket, Data), 
      loop(Socket); 
     {tcp_closed, Socket} -> 
      io:format("Socket ~p closed~n", [Socket]); 
     {tcp_error, Socket, Reason} -> 
      io:format("Error on socket ~p reason: ~p~n", [Socket, Reason]) 
    end. 

回答

3

菌種服務器循環,而不是調用start功能的過程。 Pid = spawn(fun()-> cp1:start() end).

+3

甚至更​​好的使'start'函數產生一個進程。 – rvirding 2013-03-25 02:47:40