-
Notifications
You must be signed in to change notification settings - Fork 0
andreigheta/client-server-platform
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
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 0
No packages published