Protocoale de transmisie sigura
Se cere implementarea unui protocol de transmisie sigura (cu confirmare de
primire si retransmiteri).
Se vor scrie doua programe, un emitator si un receptor. Emitatorul va citi
un text dintr-un fisier si-l va trimite linie cu linie, fiecare linie
fiind plasata intr-un alt pachet. Emitatorul trebuie sa retrimita
pachetele neconfirmate. Lungimea maxima admisa
a unei linii este de 100 caractere.
Formatul exact al pachetelor este la
alegerea voastra. Evident, va trebui sa prevedeti in pachete un camp
cu rol de numar de secventa, precum si loc pentru datele utile.
Receptorul va receptiona pachetele, le va confirma dupa caz si va extrage
informatia utila, conform formatului ales de voi. Informatia utila va fi
pusa intr-un fisier.
Pentru transmiterea efectiva a pachetelor se vor folosi functiile din
biblioteca pusa la dispozitia voastra in fisierele
llcomm.h (header-ul c++) si llcomm.o (modulul obiect); la nevoie puteti
recompila fisierul obiect din sursa
llcomm.cpp. Aceasta biblioteca simuleaza
transmiterea, cu pierderi, a pachetelor la nivel coborat. Atentie:
nu utilizati direct functii socket in nici unul dintre programe.
Biblioteca se va folosi astfel:
- Atat emitatorul cat si receptorul vor avea cate un singur obiect de
tip LL_comm. Acest obiect contine datele privind legatura cu
partenerul de comunicatie (un fel de socket). Obiectul va fi construit la
inceputul programului, punand datele de initializare intr-o structura de tip
Ll_comm_config si pasand acea structura ca argument
constructorului obiectului Ll_comm.
- Pe receptor, obiectul de tip Ll_comm se va initializa du
campul port setat la numarul unui port UDP disponibil, si cu campul
server setat pe true.
- Pe emitator, obiectul de tip Ll_comm se va initializa cu
campurile host si port setate cu masina si portul UDP
utilizate de receptor si cu campul server setat pe true.
- Emiterea unui pachet catre partener se va face, atat pentru emitator
(pentru pachete de date) cat si pentru receptor (pentru pachete de
confirmare) prin intermediul functiei send_packet(). Functia
primeste adresa zonei de memorie in care este pregatita imaginea pachetului
si dimensiunea pachetului. Fiecare apel trimite un pachet nou.
- Receptionarea unui pachet se face prin functia recv_pack().
Functia primeste ca argumente adresa in memorie unde trebuie pus pachetul,
dimensiunea maxima admisa a pachetului si un timeout. Functia asteapta
sosirea unui pachet sau expirarea timeout-ului specificat. Functia
returneaza, dupa caz, lungimea pachetului primit sau respectiv -1.
Pentru ilustrarea utilizarii bibliotecii sunt date programele
source.cpp si
dest.cpp. Atentie: programele acestea
doar ilustreaza functiile de biblioteca, nu sunt date ca exemplu de
rezolvare corecta a cerintei problemei.