This repository has been archived by the owner on May 17, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.adb
96 lines (75 loc) · 3.07 KB
/
server.adb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
with GNAT.Sockets, Text_IO, Ada.Exceptions, Ada.Strings, Ada.Strings.Fixed, Ada.Characters.Handling, p_status, p_common, p_jeu, p_server;
use GNAT.Sockets, Text_IO, Ada.Exceptions, Ada.Strings, Ada.Strings.Fixed, Ada.Characters.Handling, p_status, p_common, p_jeu;
procedure server is
function getUserBool return boolean is
entree: string(1..5);
taille: integer range 1..5;
resultat: boolean;
correct: boolean := false;
begin
while not correct loop
get_line(entree, taille);
if taille = 5 then skip_line; end if;
if to_lower(entree(1..taille)) in "oui" | "yes" | "o" | "y" | "1" | "vrai" | "true" then
resultat := true;
correct := true;
elsif to_lower(entree(1..taille)) in "non" | "no" | "n" | "0" | "faux" | "false" then
resultat := false;
correct := true;
else
put_line("Cette valeur est incorrecte, réessayez.");
end if;
end loop;
return resultat;
end getUserBool;
package p_pos_io is new integer_io(positive); use p_pos_io;
address : sock_addr_type;
server : socket_type;
nbJoueurs : positive;
contigu : boolean;
temps : positive;
begin
Initialize (Process_Blocking_IO => False);
address.addr := addresses (get_host_by_name (HOST_NAME), 1); -- Get 1st address of host
address.port := 5432;
put("Entrez le nombre de joueurs : "); get(nbJoueurs); skip_line;
put("Entrez la durée de la partie, en secondes : "); get(temps); skip_line;
put("Faut-il se limiter aux solutions contigües ? (o/n) "); contigu := getUserBool;
put_line("Start listening on address " & image(address.addr) & " and port" & Port_Type'image(address.port));
declare
package p_serverJoueurs is new p_server(nbJoueurs); use p_serverJoueurs;
begin
create_socket (server);
set_socket_option (server, SOCKET_LEVEL, (reuse_address, true));
bind_socket (server, address);
listen_socket (server); -- Start listening to connect events
for i in joueurs'range loop
accept_socket (server, joueurs(i).socket, address); -- Incoming connect events are being accepted
joueurs(i).channel := stream (joueurs(i).socket);
joueurs(i).listen.start(joueurs(i).channel, i);
envoyerMessage(joueurs(i).channel, creerMessageStatut("", AUTHENTIFICATION_NEEDED));
joueurs(i).name := (others => ' ');
end loop;
for i in joueurs'range loop
while joueurs(i).name = EMPTY_NAME and joueurs(i).connecte loop
delay 0.5;
if not envoyerMessage(joueurs(i).channel, creerMessageStatut("", VERIFICATION_CONNEXION)) then
joueurs(i).connecte := false;
end if;
end loop;
end loop;
coteServeur := true;
envoyerMessageGlobal(DEBUT_JEU, trim(Integer'image(temps), BOTH));
debutJeu(contigu, duration(temps));
while jeuEnCours loop
delay 0.5;
end loop;
envoyerMessageGlobal(FIN_JEU, "");
for i in joueurs'range loop
close_socket (joueurs(i).socket);
end loop;
close_socket (server);
end;
exception
when E : others => put_line(exception_name (E) & ": " & exception_message (E));
end server;