Descărcați ca txt, pdf sau txt
Descărcați ca txt, pdf sau txt
Sunteți pe pagina 1din 4

DOCUMENTATIE PROIECT RETELE DE CALCULATOARE

NUME PROIECT:Delphi
TIP PROIECT:C
NUME:PETROV
PRENUME:Burican Bogdan
AN:2
GRUPA:5A

ENUNT:

Sa se creeze o aplicatie client/server unde serverul primeste un numar variabil de


numere de la fiecare client. Pentru fiecare set de numere, serverul va detecta daca
acestea formeaza o progresie aritmetica sau geometrica. In caz afirmativ, va
trimite clientului ratia. Altfel, va expedia mesajul "nu".

Pentru a realiza proiectul m-am documentat atat din pagina cursului


(http://thor.info.uaic.ro/~busaco) si a laboratorului
(http://thor.info.uaic.ro/~eonica/rc), cat si din manualul " Atelier de programare
in retele de calculatoare " (autori:Corneliu Sabin Buraga,Gabriel Ciobanu).

Am folosit un server TCP concurent-forked deoarece avantajul prezentat de acestea


ar fi ca serverul poate in acest fel sa trateze mai multi clienti, care vor avea
un timp de asteptare minim in coada listen pana la acceptarea conexiunii. Pentru
fiecare nou client venit serverul va crea un fiu nou ce va lucra in paralel cu cei
deja existenti.

SERVER:seriesfs.c

In server am facut initial o functie de testare daca un sir de numere e in


progresie geometrica, aritmetica sau daca nu e in nici unul din aceste cazuri. Am
presupus initial ca sirul de numere este atat o progresie geometrica cat si
aritmetica,de aceea am initializat variabilele p_geo si p_ar cu true.
In bucla while am folosit un contor(k) pentru a parcurge secventa de numere,atat
timp cat contorul este mai mic decat numarul de numere(nr) si macar una din cele
doua variabile are valoarea true.Daca amandoua ar avea valoarea false nu am avea de
ce sa mai verificam si sa mergem mai departe.In functie de rezultatul din cele doua
variabile, se va trimite prin buffer mesajul corespunzator catre client.

int progresie(int fd)


{
int p_geo=true;//presupunem initial ca numerele sunt in progresie geometrica
int p_ar=true;//presupunem initial ca numerele sunt in progresie aritmetica
int nr;//numarul de nr
int v[100];//vectorul cu nr
char buffer[100];//transmitere mesaje client-server
int contor=0;
int q;//ratia

contor = read(fd, &nr, sizeof(int)); //citim numarul de numere


if (contor <= 0) //in caz de esec la citire
{
perror ("Eroare la read() => client.\n");
close (fd); //inchidem descriptorul
return 0;
}
printf("%d\n",nr);//afisam numarul de numere

contor=read(fd, v, sizeof(v));//citim v,vectorul de numere


if (contor <= 0)//in caz de esec la citire
{
perror ("Eroare la read() => client.\n");
close (fd); //inchidem descriptorul
return 0;
}
int j;
for(j=0;j<nr;j++)
printf("%d\n",v[j]);//afisam secventa de numere

if(nr>=3) //nu are rost sa verificam pentru mai putin de 3 numere daca sunt sau nu
in progresie
{
int k=1;
while((k<nr)&&((p_geo == true)||(p_ar == true)))
{

if (((v[1]/v[0])*v[k-1])!=v[k]) {p_geo=false;} //nu sunt in progresie


geometrica;
if (( (v[1]-v[0]) +v[k-1])!=v[k]) {p_ar=false;}//nu sunt in progresie
aritmetica;
k++;
}
if(p_geo==true)
{
q=(v[1]/v[0]);
strcpy(buffer,"progresie geometrica"); //daca numerele sunt in progresie
geometrica,vom avea in buffer sirul de caractere "progresie geometrica" pe care il
vom transmite ulterior clientului
}

if(p_ar==true)
{
q=v[1]-v[0];

strcpy(buffer,"progresie aritmetica");//daca numerele sunt in progresie


aritmetica,vom avea in buffer sirul de caractere "progresie aritmetica" pe care il
vom transmite ulterior clientului

if((p_geo==false)&&(p_ar==false))
{strcpy(buffer,"nu"); }//daca numerele nu sunt in progresie,vom avea in
buffer sirul de caractere "nu" pe care il vom transmite ulterior clientului

//transmitem clientului buffer-ul cu mesajul corespunzator si ratia

if (write (fd, buffer, sizeof(buffer)) <= 0) //transmitere buffer


{
perror ("Eroare la write() spre client.\n");
return 0;
}
if(write(fd,&q,sizeof(int))<=0)//transmitere ratie
{
perror ("Eroare la write() spre client.\n");
return errno;
}
}
return contor;

In programul principal se pot vedea etapele parcurse de serverul TCP concurent prin
metoda forked:

-declararea structurilor pentru client,server,cat si a descriptorilor de socket;


-crearea socketului;
-umplerea structurilor cu valorile corespunzatoare;
-atasarea socketului folosind primitiva bind;
-asteptarea clientilor folosind primitiva listen;
-clientii vor fi tratati in mod concurent;in acest scop am utilizat fork();in
procesele copii se vor tratata clientii,folosind functia progresie;

CLIENT:seriesc.c

In client,in programul principal voi avea structura folosita pentru conectarea la


server,descriptorul de socket si buffer-ul prin care se realizeaza comunicarea
client-server.

Etapele sunt cele tipice ale unui client TCP:


-creare socket;
-umplerea structurilor cu valorile corespunzatoare in vederea realizarii conectarii
la server;
-conectarea la server folosind primitiva connect();

Apoi se realizeaza transmiterea de mesaje intre client si server prin intermediul


primitivelor read() si write();
-citim numarul de numere(nr) si punem conditia sa fie >=3 pentru a putea forma o
progresie;
-prin intermediul primitivei write() transmitem numarul de numere(nr);
-citim secventa de numere ce trebuie testata daca e in progresie si o trimitem
serverului tot utilizand write();
-serverul primeste nr de nr si secventa si va returna prin intermediul buffer-ului
in ce fel de progresie sunt numerele sau "nu" in cazul in care nu sunt in
progresie;
-in cazul in care numerele sunt in progresie,este primita si ratia=q;
-clientul citeste buffer-ul si ratia trimise de sever prin intermediul primitivei
read();

int nr;//numarul de nr
int v[100];//vect.cu nr
char buffer[100];//transm.mesaje client-server
printf("Introduceti nr de valori (nr>=3)\n");
do{
scanf("%d",&nr);
if (nr<3) printf("numarul trebuie sa fie mai mare de 3, reintroduceti
valoarea\n");
} while (nr<3);

if(write(sd,&nr,sizeof(int))<=0)
{
perror ("Eroare la write() spre server.\n");
return errno;
}
printf("Citirea sirului de numere\n");
int i;
for(i=0;i<nr;i++)
scanf("%d",&v[i]);
if(write(sd,v,sizeof(v))<=0)
{
perror ("Eroare la write() spre server.\n");
return errno;
}
int q;
if (read (sd, buffer, sizeof(buffer)) < 0)
{
perror ("Eroare la read() de la server.\n");
return errno;
}
if (read(sd, &q, sizeof(int)) <= 0)
{
perror ("Eroare la read() de la server.\n");
return errno;
}

if (strcmp(buffer,"nu")==0) {printf("%s\n",buffer);}
else {printf ("`%s ratia %d`\n", buffer,q);}

FISIERELE:
Pentru sever:seriesfs.c
Pentru client:seriesc.c

Se deschid 2 sau mai multe sesiuni :in una rulam serverul


gcc seriesfs.c �o srv
./srv

In cea de-a doua sau celelalte rulam clientii:


gcc seriesc.c �o cl
./cl 127.0.0.1 17171

127.0.0.1-adresa de loopback
17171 este portul folosit in server

S-ar putea să vă placă și