Guest User

Untitled

a guest
Jul 20th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.67 KB | None | 0 0
  1. -module(server).
  2.  
  3. -behaviour(gen_server).
  4.  
  5. -export([start_link/0, stop/0]).
  6. -export([init/1, handle_call/3, handle_cast/2, handle_info/2,
  7. terminate/2, code_change/3]).
  8.  
  9. -export([accept/1]).
  10. -export([receive_loop/1]).
  11.  
  12. -record(state, {
  13. % listen socket
  14. listener
  15. }).
  16.  
  17. -define(SERVER, ?MODULE).
  18.  
  19. start_link() ->
  20. gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
  21.  
  22. accept(Socket) ->
  23. case gen_tcp:accept(Socket) of
  24. {ok, Sock} ->
  25. spawn(?MODULE, receive_loop, [Sock]),
  26. accept(Socket);
  27. {error, Reason} ->
  28. Reason
  29. end.
  30.  
  31. receive_loop(Socket) ->
  32. case gen_tcp:recv(Socket, 0) of
  33. {ok, Data} ->
  34. case Data of
  35. <<"q\r\n">> ->
  36. gen_tcp:send(Socket, "quit \n"),
  37. gen_tcp:close(Socket);
  38. _ ->
  39. receive_loop(Socket)
  40. end;
  41. {error, closed} ->
  42. ok
  43. end.
  44.  
  45.  
  46. stop() ->
  47. io:format("Server stop! \n "),
  48. gen_server:cast(?MODULE, stop).
  49.  
  50. %
  51. % Callback functions
  52. %
  53. init([]) ->
  54. Port = 110,
  55. Opts = [binary, {reuseaddr, true},
  56. {keepalive, false}, {ip,{0,0,0,0}}, {active, false}],
  57.  
  58. case gen_tcp:listen(Port, Opts) of
  59. {ok, ListenSocket} ->
  60. spawn(?MODULE, accept, [ListenSocket]),
  61. {ok, #state{ listener = ListenSocket}};
  62. {error, Reason} ->
  63. {stop, Reason}
  64. end.
  65.  
  66. handle_call(_Request, _From, State) ->
  67. Reply = ok,
  68. {reply, Reply, State}.
  69.  
  70. handle_cast(stop, State) ->
  71. {stop, normal, State}.
  72.  
  73. handle_info(_Info, State) ->
  74. {noreply, State}.
  75. %
  76.  
  77. %
  78. % terminate server
  79. %
  80. terminate(_Reason, State) ->
  81. gen_tcp:close(State#state.listener),
  82. ok.
  83.  
  84. %
  85. % Hot code change
  86. %
  87. code_change(_OldVsn, State, _Extra) ->
  88. {ok, State}.
  89. %
Add Comment
Please, Sign In to add comment