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)

浙公网安备 33010602011771号