Skip to content

andreigheta/client-server-platform

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.




About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published