Guest User

Untitled

a guest
Aug 1st, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 3.26 KB | None | 0 0
  1. -module(server).
  2. -export([start/0, start/1, stop/1, run/2, client_register/2]).
  3.  
  4. %% Inclusion des librairies tierces
  5. -include("datas.hrl").
  6.  
  7. %% Lancement du serveur
  8. start() -> start(?default_port).
  9. start(Port) ->
  10.     database:start(),
  11.     Listener =
  12.         case gen_tcp:listen(Port, [{packet, 0}, {active, false}, {reuseaddr, true}]) of
  13.             {ok, ListenSocket} ->
  14.                 %% Serveur lancé
  15.                 io:format("Host Launched on: ~p~n", [Port]),
  16.                 ListenSocket;
  17.             {error, Raison} ->
  18.                 %% Serveur impossible à lancer
  19.                 io:format("Host Running failed on ~p: [~p]~n", [Port, Raison]),
  20.                 exit(Raison)
  21.         end,
  22.     %% Procédure de lancement du serveur
  23.     Pollable = database:list_pollable(),
  24.     spawn(?MODULE, run, [Listener, Pollable]).
  25.  
  26. %% Procédure d'arrêt du serveur
  27. stop(Pid) ->
  28.     database:stop(),
  29.     Pid ! {stop},
  30.     ok.
  31.  
  32. %% Interpretation du serveur
  33. run(ListenSocket, Pollable) ->
  34.     process_flag(trap_exit, true),
  35.     loop(ListenSocket, Pollable).
  36.  
  37. %% Boucle d'exécution du serveur
  38. loop(ListenSocket, Pollable) ->
  39.     %% Boite à message concurrente
  40.     receive
  41.         {stop} ->
  42.             %% Fermeture du serveur
  43.             io:format("Host has been stopped~n", []),
  44.             exit(normal);
  45.         {'EXIT', Pid, Raison} ->
  46.             %% Destruction de la session du membre
  47.             io:format("Disconnection of a client~n", [])
  48.         %% Repos
  49.         after 100 -> timeout
  50.     end,
  51.     %% Traitement des entrées
  52.     case gen_tcp:accept(ListenSocket, 100) of
  53.         {ok, Socket} ->
  54.             case serverActive() of
  55.                 false ->
  56.                     io:format("Not in Election Interval~n", []),
  57.                     gen_tcp:send(Socket, "Not in Election Interval~n"),
  58.                     gen_tcp:close(Socket);
  59.                 true ->
  60.                     %% Réception des messages envoyés
  61.                     io:format("New connection~n", []),
  62.                     PClientID = spawn_link(?MODULE, client_register, [Socket, Pollable]),
  63.                     gen_tcp:controlling_process(Socket, PClientID)
  64.             end,
  65.             run(ListenSocket, Pollable);
  66.         %% Timer de repos au serveur
  67.         {error, timeout} ->
  68.             %% Récursion
  69.             run(ListenSocket, Pollable)
  70.     end.
  71.  
  72. %% Gestion des clients connectés
  73. client_register(Socket, Pollable) ->
  74.     case gen_tcp:recv(Socket, 0) of
  75.         {ok, Data} ->
  76.             %% Gestion de la connexion
  77.             Tokenize = string:tokens(Data, " "),
  78.             case Tokenize of
  79.                 [Hash, Vote] ->
  80.                     {CanVote, []} = database:is_client(string:to_integer(Hash)),
  81.                     IntVote = string:to_integer(Vote),
  82.                     case CanVote of
  83.                         error ->
  84.                             gen_tcp:send(Socket, "Not valid Hashkey~n"),
  85.                             io:format("Vote fail~s~n", [Hash]),
  86.                             gen_tcp:close(Socket);
  87.                         Value ->
  88.                             database:insert_poll(IntVote),
  89.                             database:unfold_client(Value),
  90.                             gen_tcp:send(Socket, "Vote Executed~n"),
  91.                             io:format("Vote saved~n", []),
  92.                             gen_tcp:close(Socket)
  93.  
  94.                     end;
  95.                 _ ->
  96.                     gen_tcp:send(Socket, "Not valid protocol~n"),
  97.                     gen_tcp:close(Socket)
  98.             end,
  99.             %% Récursion du client
  100.             client_register(Socket, Pollable);
  101.         {error, closed} ->
  102.             gen_tcp:close(Socket)
  103.     end.
  104.  
  105. %% Interrogation sur l'activité du serveur
  106. serverActive() ->
  107.     {CurrY, CurrM, CurrD} = date(),
  108.     {BeginY, BeginM, BeginD} = ?date_begin,
  109.     {EndY, EndM, EndD} = ?date_end,
  110.     CurrentTime = (CurrY*10000) + (CurrM*100) + CurrD,
  111.     BeginTime = (BeginY*10000) + (BeginM*100) + BeginD,
  112.     EndTime = (EndY*10000) + (EndM*100) + EndD,
  113.     (CurrentTime > BeginTime) and (CurrentTime < EndTime).
Add Comment
Please, Sign In to add comment