Skip to content

Instantly share code, notes, and snippets.

@egisatoshi
Created April 3, 2015 03:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save egisatoshi/08700a6a9e2553366df0 to your computer and use it in GitHub Desktop.
Save egisatoshi/08700a6a9e2553366df0 to your computer and use it in GitHub Desktop.
Very Simple Echo Sever in Erlang
-module(echo_server).
-export([start/0,stop/1]).
-define(PORT, 12321).
start() ->
Options = [binary, {packet, raw}, {active, true}, {reuseaddr, true}],
case gen_tcp:listen(?PORT, Options) of
{ok, Listen} -> spawn(fun() -> acceptor_loop(Listen) end),
{ok, Listen};
{error, _} ->
stop
end.
stop(Listen) ->
gen_tcp:close(Listen),
ok.
acceptor_loop(Listen) ->
case gen_tcp:accept(Listen) of
{ok, Client} ->
Pid = spawn(fun() -> server_loop(Client) end),
gen_tcp:controlling_process(Client, Pid),
acceptor_loop(Listen);
{error, closed} ->
stop;
{error, timeout} ->
io:format("accept failed: timeout~n"),
stop;
{error, Reason} ->
io:format("accept failed: ~p~n", [Reason]),
stop
end.
server_loop(Client) ->
receive
{tcp, Client, Data} ->
gen_tcp:send(Client, Data),
inet:setopts(Client, [{active, once}]),
server_loop(Client);
{tcp_closed, _} ->
ok;
_ ->
error
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment