Erlang Echo Server

Erlang Echo Server

 

-module(tcp_echo).  
   
-export([listen/0, listen/1]).  
   
-define(DEFAULT_PORT, 1155).  
-define(OPTION, [binary, {active, false}, {reuseaddr, true}]).  
   
listen() ->  
  ListenPort = get_app_env(listen_port, ?DEFAULT_PORT),  
    listen(ListenPort).  
   
listen(ListenPort) ->  
    io:format("Server listening on port: ~p~n", [ListenPort]),  
    {ok, ListenSocket} = gen_tcp:listen(ListenPort, ?OPTION),  
    accept(ListenSocket).  
   
get_app_env(Opt, Default) ->  
    case application:get_env(application:get_application(), Opt) of  
        {ok, Value} -> Value;  
        _ ->  
            case init:get_argument(Opt) of  
                [[Value | _]] -> Value;  
                error -> Default  
            end  
    end.  
   
accept(ListenPort) ->  
    {ok, Socket} = gen_tcp:accept(ListenPort),  
    io:format("Connection accept: ~p~n", [Socket]),  
    Pid = spawn(fun() ->   
        loop(Socket)   
    end),  
    gen_tcp:controlling_process(Socket, Pid),  
    io:format("controlling_process~n"),  
    Pid ! {ack, self()},  
    accept(ListenPort).  
   
loop(Socket) ->  
    receive  
        {ack, _Parent} ->   
            io:format("Parent: ~p~n", [_Parent]),  
            child_loop(Socket)  
    end.  
   
child_loop(Socket) ->  
    inet:setopts(Socket, [{active, once}]),  
    receive  
        {tcp, Socket, Data} ->  
            io:format("From socket ~p:~p~n", [Socket, Data]),  
            gen_tcp:send(Socket, Data),  
            child_loop(Socket);  
        {tcp_closed, Socket} ->  
            io:format("Socket ~p closed.~n", [Socket]);  
        {tcp_error, Socket, Reason} ->  
            io:format("An error occurs on socket ~p~n\tReason: ~p~n", [Socket, Reason])  
    end.  

  

来自个人csdn博客(http://blog.csdn.net/genesislive/article/details/8718007

 

posted @ 2013-04-22 14:49  genesislive  阅读(153)  评论(0)    收藏  举报