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