Guest User

Untitled

a guest
Oct 20th, 2017
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 2.15 KB | None | 0 0
  1. -module(simple_tcp).
  2. -behaviour(gen_server).
  3.  
  4. %% API
  5. -export([start_link/1, stop/0, start/0, start/1]).
  6.  
  7. %% gen-server callbacks
  8. -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
  9.  
  10. -define(SERVER, ?MODULE).
  11. -define(DEFAULT_PORT, 1055).
  12.  
  13. -record(state, {port, lsock}).
  14.  
  15. start_link({port, Port}) ->
  16.     gen_server:start_link(?MODULE, [{port, Port}], []);
  17.  
  18. start_link({socket, Socket}) ->
  19.     gen_server:start_link(?MODULE, [{socket, Socket}], []).
  20.  
  21. start({port, Port}) ->
  22.     simple_tcp_sup:start_child({port, Port});
  23.  
  24. start({socket, Socket}) ->
  25.     simple_tcp_sup:start_child({socket, Socket}).
  26.  
  27. start() ->
  28.     start({port, ?DEFAULT_PORT}).
  29.  
  30. stop() ->
  31.     gen_server:cast(?SERVER, stop).
  32.  
  33. % Callback functions
  34. init([{port, Port}]) ->
  35.     {ok, LSock} = gen_tcp:listen(Port, [{active, true},{reuseaddr, true}]),
  36.     init([{socket, LSock}]);
  37.  
  38. init([{socket, Socket}]) ->
  39.     io:fwrite("Starting server with socket: ~p~n", [self()]),
  40.     {ok, Port} = inet:port(Socket),
  41.     {ok, #state{port=Port, lsock=Socket}, 0}.
  42.  
  43. handle_call(_Msg, _From, State) ->
  44.     {noreply, State}.
  45.  
  46. handle_cast(stop, State) ->
  47.     {stop, ok, State}.
  48.  
  49. handle_info({tcp, Socket, RawData}, State) ->
  50.     gen_tcp:send(Socket, io_lib:fwrite("Received raw data: ~p~n", [RawData])),
  51.     {noreply, State};
  52.  
  53. handle_info({tcp_error, _Socket, Reason}, State) ->
  54.     io:fwrite("Error: ~p~n", [Reason]),
  55.     {stop, normal, State};
  56.  
  57. handle_info(timeout, #state{lsock = LSock} = State) ->
  58.     case gen_tcp:accept(LSock) of
  59.         {ok, Sock} ->
  60.             io:fwrite("Accepting connection...~p~n", [self()]),
  61.             start({socket, LSock}),
  62.             {noreply, #state{lsock=Sock}};
  63.  
  64.         {error, Reason} ->
  65.             io:fwrite("Error: ~p, ~p~n", [Reason, self()]),
  66.             {stop, normal, State}
  67.     end;
  68.  
  69. handle_info({tcp_closed, _Port}, State) ->
  70.     io:fwrite("Socket closed: ~p~n", [self()]),
  71.     simple_tcp_sup:kill_child(self()),
  72.     {stop, normal, State}.
  73.  
  74. terminate(_Reason, _State) ->
  75.     io:fwrite("Shutting down server: ~p~n", [self()]),
  76.     ok.
  77.  
  78. code_change(_OldVsn, State, _Extra) ->
  79.     {ok, State}.
Add Comment
Please, Sign In to add comment