-
Notifications
You must be signed in to change notification settings - Fork 0
RazorBest/Tema2-PC---client-server-TCP
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
# Aplicatie client-server TCP si UDP pentru gestionarea mesajelor Am implementat aplicatiile client si server pornind de la codul scris la laboratorul 8, urmand ca ulterior sa decuplez anumite componente cu functionalitati bine definite. Voi descrie protocolul de nivel aplicatie prin formatul pachetelor care circula intre clienti si server. Apoi, voi descrie protocolul de incadrare al protocoalelor TCP. Voi descrie cum s-a facut multiplexarea canalelor de comunicare pentru client si server. ## Tipurile de pachete la nivelul aplicatie 1. News - pachete trimise de clientii UDP la server. Format: [ TOPIC | TIP_DATE | VALUE ] TOPIC - 50 de octeti TIP_DATE - un octet VALUE - un sir variabil de maxim 1500 de octeti care va fi interpretat in functie de valoare din TIP_DATE. 2. Subscriber news - pachet de news trimis de la server la subscriberi prin TCP. Asemanator cu News, dar se adauga si ip-ul si portul de unde a fost primit initial pachetul. Format: [ UDP_IP | UDP_PORT | TOPIC | TIP_DATE | VALUE ] UDP_IP - 4 octeti care reprezinta ip-ul sursei de news UDP_PORT - 2 octeti care reprezinta portul sursei de news 3. Command - pachetete trimise intre subscriberii TCP si server care au rolul de autentificare si comandare. Acestea au lungime fixa. [ TIP | DATE ] DATE - date de comanda al caror format depinde de TIP. Particularizarile sunt descrise la fiecare TIP. TIP - un octet care reprezinta tipul pachetului Command. Poate fi: - TYPE_AUTH - Indica cererea (subscriber->server) de autentificare sau confirmarea autentificarii (server->subscriber). Astfel, daca un server primeste un astfel de pachet, pentru confirmare, acesta va trebui sa trimita inapoi acelasi pachet (daca ID-ul este unic). Orice client trebuie sa trimita un astfel de pachet la inceput si trebuie validat. Daca nu, nu vor fi luate in considerare celelate comenzi. Format: [ "TYPE_AUTH" | ID | UNUSED_DATA ] ID - un sir de caractere care reprezinta id-ul subscriber-ului cu care acesta incearca sa se autentifice. - TYPE_AUTH_DUPLICATE - Indica rejecarea autentificarii (server->subscriber) deoarece id-ul este deja folosit de alt client. Clientul ramane in starea de autentificare si inca nu poate trimite alte comenzi in afara de TYPE_AUTH. Format: [ "TYPE_AUTH_DUPLICATE" | ID | UNUSED_DATA ] ID - un sir de caractere care reprezinta id-ul duplicat. - TYPE_SUB - Pachet subscriber->server care indica cererea de abonare la un topic. El va primi doar noutatile care sunt generate cat timp clientul e online. Format: [ "TYPE_SUB" | TOPIC | UNUSED_DATA ] TOPIC - Un sir de 50 de octeti care indica topic-ul la care clientul vrea sa se aboneze. - TYPE_SUB_SF - Pachet subscriber->server care indica cererea de abonare la un topic. La fel ca TYPE_SUB, dar diferenta este ca clientul vrea sa primeasca noutatile care au fost trimise chiar si cand clientul nu era conectat. Astfel, la conectare, clientul va primi toate noutatile cu care a ramas in urma, cat timp a fost deconectat. Format: [ "TYPE_SUB_SF" | TOPIC | UNUSED_DATA ] TOPIC - Un sir de 50 de octeti care indica topic-ul la care clientul vrea sa se aboneze online+offline. - TYPE_UNSUB - Pachet subscriber->server care indica cererea de dezabonare la un topic. Format: [ "TYPE_SUB_SF" | TOPIC | UNUSED_DATA ] TOPIC - Un sir de 50 de octeti care indica topic-ul la care clientul vrea sa se dezaboneze. - TYPE_NOT_AUTH - Pachet server->subscriber care indica ca clientul inca nu s-a autentificat cu un id. Este trimis atunci cand clientul trimite o comanda la care inca nu are drepturi. ## Protocolul de incadrare Pentru ca TCP este tip flux, am aplicat un protocol simplu de incadrare intre TCP si nivelul aplicatie. Acest protocol a fost implementat de clasa BufferedTcpSocket. Pachetul protocolului de incadrare are urmatorul format: [ LUNGIME | PACHET_APLICATIE ] - LUNGIME - numarul de octeti pe care ii are PACHET - PACHET_APLICATIE - date care reprezinta un pachet de nivel aplicatie Clasa BufferedTcpSocket are doua metode principale de interfatare: recv si send. Metoda send apeleaza functia send() din sys/socket.h. Metoda recv apeleaza functia globala recv() din sys/socket.h si stocheaza pachetul intr-un buffer. Daca se cumuleaza mai multe pachete, acestea se pun intr-o coada de buffere. Pentru a obtine aceste pachete Cum se foloseste un BufferedTcpSocket? In descrierea pasilor, prin "utilizator" ne referim la entitatea care foloseste clasa BufferedTcpSocket: 1. Se creeaza obiectul caruia i se da un socket. Acest socket e initializat de utilizator 2. Se apeleaza metoda send() pentru a se trimite un mesaj de o anumta lungime. Acesta va arunca exceptii daca mesajul e prea lung sau daca exista o eroare de trimitere la nivel TCP. 3. Se apeleaza metoda recv() pentru a citi mesaje de pe canalul TCP. Mesajele sunt stocate in bufferul, intern. Utilizatorul, inca nu are acces la ele. 4. Se apeleaza packet_ready() pentru a verifica daca exista cel putin un pachet. Daca nu, se trece la pasul 6. 5. Se apeleaza write_packet() care scrie un pachet in buffer. Pachetul e scos din coada interna. Ne intoarcem la pasul 4. 6. Daca mai avem nevoie de date, asteptam cu select, si ne intoarcem la pasii 2 sau 3. Daca nu, trecem la pasul 7. 7. Apelam reset ca sa golim bufferul si coada de pachete. Acest pas nu este obligatoriu. 8. Utilizatorul apeleaza close pe socket si distruge obiectul de BufferedTcpSocket. ## Multiplexarea canalelor de comunicare Multiplexarea clientilor TCP si a stdin-ului este facuta de clasa MultiSocket. Ping, ping, ping... Temele ma-nving, Creierul da timeout, Inima da seg fault Si plange ca un flaut. Sunt pierdut printre pachete Ca o datagrama Cunostinte incomplete Si lipsit de mama. Sperantele s-au ofilit Cand am vazut finalul: Un "0 puncte" necajit Patase terminalul.
About
No description, website, or topics provided.
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published