-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathREADME
More file actions
84 lines (63 loc) · 3.53 KB
/
README
File metadata and controls
84 lines (63 loc) · 3.53 KB
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
Gheta Andrei-Cristian 322CA
==STRUCTURA==
Folosim un array pentru clienti si unul pentru poll-uri.
Folosim structura de chat_packet pentru packetele trimise, deoarece ne ajuta
sa avem o liniaritate in program, din moment ce mesajele udp se bazeaza strict
pe aceasta structura de topic, data_type si payload.
Folosim structura de protocol pentru a incapsula packetele. De fiecare data
cand citim si trimitem, stim exact cat trebuie sa o facem, intrucat avem un
camp de length care ne spune lungimea payload-ului care urmeaza a fi trimis
sau primit. Asa ca, de fiecare data cand folosim receive sau send, mai intai
citim/scriem un sizeof(int) pentru a sti lungimea, iar mai apoi restul
informatiei.
Folosim structura de tcp_client pentru a stoca clientii si informatiile lor.
==SERVER==
Initial, am inceput prin a initializa tot ceea ce tine de server. Am creat
doua socket-uri, unul pentru tcp, unul pentru udp. Am folosit, de asemenea,
SO_REUSEADDR pentru ambele socket-uri, iar apoi am dezactivat algoritmul lui
Nagle. Am continuat prin a completa structura de server address, iar apoi am
folosit bind pe ambele socket-uri pentru a le asigna acest server address,
urmand ca apoi sa folosesc listen pe socket-ul de tcp pentru a asculta
noile conexiuni de pe viitor.
Pentru rularea server-ului am folosit multiplexarea cu poll. Am folosit un
array care tine in el toate fd-urile clientilor care au conexiune cu server-ul.
Am adaugat initial 3 valori in acesta, si anume, input-ul de la STDIN,
socket-ul de tcp si cel de udp.
Ca si cazuri mari avem urmatoarele:
- cazul in care server-ul foloseste keyboard input si da comanda "exit"
- cazul de conexiune noua tcp
- cazul de mesaj nou de la udp
- cazul de receive de la tcp
Cazul de keyboard input:
Doar citim intr-un buffer de la tastatura si daca cumva a fost data comanda
"exit" atunci golim resurse server-ului si il inchidem.
Cazul conexiune noua tcp:
Folosim accept pentru o noua conexiune si dezactivam algoritmul lui Nagle.
adaugam noul socket in array-ul de poll-uri pe eventul de POLLIN. Mai apoi
ne ocupam de construirea clientului nou, iar apoi il adaugam in array-ul de
clienti.
Cazul mesaj nou de la udp:
Initial citim toata informatia de la udp intr-un buffer, iar apoi bazat pe
tabelul de referinta primit ne construim packet-ul de date. La final il
incapsulam intr-un protocol iar apoi il trimitem catre toti abonatii
topicului.
Cazul receive de la tcp:
Pe acest caz primim packete de la subscriberi cu topicuri care reprezinta
actiuni pe care vor sa le realizeze pe server precum ar fi "subscribe",
"unsubscribe" si "exit".
==SUBSCRIBER==
Initial, am inceput prin a extrage informatiile importante din linia de comanda.
am obtinut un fd pentru socket-ul tcp. Ca si la server, am completat structura
de server address pentru a o folosi la conectarea la server.
In cazul subscriber-ului avem doar doua cazuri mari, in concluzie vom avea un
array de doua poll-uri:
- cazul de input de la STDIN
- cazul in care este primit un packet de la server
Cazul de input de la STDIN:
Citim intr-un buffer input-ul, iar apoi construim un packet de la 0 in care
folosim topic-ul la care se da subscribe ca topic al packet-ului si ca payload
folosim comanda data (subscribe, unsubscribe, exit).
Cazul in care este primit un packet de la server:
Dam receive la informatia primita, daca return-ul este 0, inseamna ca client-ul
a ajuns sa-si dea exit, deci nu avem ce informatie sa-i trimitem. Altfel,
afisam ce a primit acesta de la udp prin intermediul serverului.