-
Notifications
You must be signed in to change notification settings - Fork 0
/
readme.txt
108 lines (85 loc) · 4.96 KB
/
readme.txt
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
97
98
99
100
101
102
103
104
105
106
107
108
324CC Cioban George-Adrian
Protocale de Comunicatie
Tema 2
Timp de implemenentare: 2 Zile (cumulat) de lucru
Resurse folosite:
// Schelet de cod (Lab 6, 7, 8)
- Laboratoarele de Protocoale de Comunicație
// Utilizare poll()
- https://man7.org/linux/man-pages/man2/poll.2.html
- https://www.ibm.com/docs/en/i/7.3?topic=designs-using-poll-instead-select
// Dezactivare alg. Neagle
- https://stackoverflow.com/questions/31997648/where-do-i-set-tcp-nodelay-in-this-c-tcp-client
Explicatii pentru rezolvarea temei:
Descrierea claselor folosite
(0) Server - Clasa folosita pentru a implementa partea de server
Destructorul este apelat automat la iesirea din scope
Acesta se ocupa cu inchiderea tuturor socket-urilor
Diversele campuri si metode din aceasta clasa sunt
descrise in comentariile din cod
Metode mai importante:
- handlePolls
Metoda executata doar atunci cand s-a primit un raspuns
pe cel putin unul dintre socket-urile conectate la server
Proceseaza input de la toti clientii (TCP si UDP) dar si
comenzi de la tastatura
- createClient
Metoda folosita pentru a adauga un client nou in lista de
clienti a serverului, verifica daca id-ul nu este inregistrat
deja, trimite toate mesajele restante unui client care s-a
reconectat
- getClientCommand
Proceseaza diversele comenzi venite de la clienti (sub cu/fara sf,
unsubscribe)
- broadcastMsg
Metoda ce primeste un mesaj si il trimite la toti clientii
interesati, iar pentru clientii offline dar cu store enabled
adauga un pointer la structura de tip storedMsg [1] in lista
cu mesaje in asteptare a fiecarui client
[1] Structura storedMsg contine:
- un int ce reprezinta numarul de clienti ce mai trebuie sa primeasca
mesajul
- mesajul in sine
Pentru fiecare mesaj este creata o singura structura de acest tip
iar pointerul este adaugat la lista de mesaje in asteptare a fiecarui
client offline dar cu SF enabled pentru topicul mesajului.
De fiecare data cand un client primeste mesajul restant, int-ul reach
este decrmentat iar cand ajunge la 0 memoria ocupata de structura este
eliberata. Astfel am decis sa implementez functionalitatea de store
and forward fara sa ocup mai multa memorie decat este necesar
(1) Client - Clasa folosita pentru a descrie un client TCP, folosita in
implementarea serverului
Detalii despre campuri au fost lasate ca si comentarii in
ClientClass.cpp
(2) Topic - Clasa folosita pentru a grupa toti subscriberii unui topic
* Am vrut ca aceasta clasa sa cuprinda initial mai multe functionalitati
insa acestea au fost mutate in alte clase/ implementate in alte moduri
de aceea a ramas un singur camp (lista de clienti ce au dat subscribe)
Descrierea protocolului de comunicatie Server-Client TCP
+---------------------------------+---------------------------------+
| Server | Client |
+=================================+=================================+
| Deschide un socket de ascultare | |
| pentru conexiuni noi | |
+---------------------------------+---------------------------------+
| | Trimite o cerere de conectare |
| | catre server urmata imediat de |
| | un string ce contine ID-ul |
+---------------------------------+---------------------------------+
| Serverul confirma clientului | Clientul asteapta confirmare de |
| ca s-a conectat cu succes | la server, in cazul in care |
| trimitand un message cu type | primeste DENIED programul se |
| setat pe 6 (ACCEPT) altfel | termina |
| trimite 7 (DENIED) | |
+---------------------------------+---------------------------------+
| Serverul preia comanda de la | Clientul poate trimite comenzi |
| client si face operatiunile | de tip subscribe/unsubscribe |
| necesare (ex: adaugare in | |
| lista de subscriberi la un | |
| topic) | |
+---------------------------------+---------------------------------+
| Serverul primeste un mesaj de | Clientul afiseaza la STDOUT |
| la un client UDP si itereaza | mesajele primite de la server |
| prin toti clientii ce au dat | |
| subscribe la topicul mesajului | |
+---------------------------------+---------------------------------+