Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pc:laboratoare:08 [2020/03/30 11:44]
radu.ciobanu
pc:laboratoare:08 [2022/05/02 11:48] (current)
vlad_andrei.badoiu [Exerciții]
Line 30: Line 30:
  
 Argumentele funcției //​select()//:​ Argumentele funcției //​select()//:​
-  * //numfds// - cea mai mare valoare ​+ 1 a unui descriptor din cele 3 mulțimi+  * //numfds// - valoarea ​cea mai mare + 1 a unui descriptor din oricare ​cele 3 mulțimi
   * //readfds// - mulțimea cu descriptori de citire   * //readfds// - mulțimea cu descriptori de citire
   * //​writefds//​ - mulțimea cu descriptori pentru scriere   * //​writefds//​ - mulțimea cu descriptori pentru scriere
Line 57: Line 57:
 Un exemplu de server TCP ce folosește apelul //​select()//​ pentru multiplexare se află în arhiva suport a acestui laborator. În mulțimea de citire a serverului se află inițial descriptorul pentru socketul inactiv. Apoi, pe măsură ce se conectează clienții, în mulțime vor fi adăugați și descriptorii pentru sockeții activi (cei pe care se trimit/​primesc date la/de la clienți). Un exemplu de server TCP ce folosește apelul //​select()//​ pentru multiplexare se află în arhiva suport a acestui laborator. În mulțimea de citire a serverului se află inițial descriptorul pentru socketul inactiv. Apoi, pe măsură ce se conectează clienții, în mulțime vor fi adăugați și descriptorii pentru sockeții activi (cei pe care se trimit/​primesc date la/de la clienți).
  
 +<​note>​
 +Functia **send** va intrerupe programul daca este apelata cu un descriptor de fisiere al unei conexiuni inchise. Pentru a evita acest efect pasati ca parametru **flags**, valoarea: **MSG_NOSIGNAL**
 +</​note>​
  
 ==== Exerciții ==== ==== Exerciții ====
  
-Pornind de la codul disponibil ​{{:pc:​laboratoare:lab8-skel.zip|aici}}, aveți de implementat următoarele cerințe:+Pornind de la codul disponibil ​[[https://​gitlab.cs.pub.ro/​protocoale-de-comunicatie/​pcom-laboratoare-public/​-/​tree/​master/​lab8|aici]], aveți de implementat următoarele cerințe:
  
   - Modificați programul client astfel încât să se comporte ca în laboratorul trecut (să citească de la tastatură și să trimită serverului, apoi să primească de la server și să afișeze). Modificați și programul server astfel încât să funcționeze cu 2 clienți: să trimită clientului 1 ce a primit de la clientul 2 și invers.   - Modificați programul client astfel încât să se comporte ca în laboratorul trecut (să citească de la tastatură și să trimită serverului, apoi să primească de la server și să afișeze). Modificați și programul server astfel încât să funcționeze cu 2 clienți: să trimită clientului 1 ce a primit de la clientul 2 și invers.
Line 66: Line 69:
   - Modificați programul server ca să funcționeze cu mai multi clienți. Clienții vor trimite în mesaj și destinația mesajului (acest lucru se poate face și fără modificarea codului clienților,​ vedeți exemplul). În cadrul acestui laborator, putem folosi descriptorul socketului întors de //​accept()//​ ca identificator pentru un client (în aplicații reale, clienții nu au acces la aceste valori). Exemplu: clientul cu socketul 5 poate trimite (mesaj citit de la tastatură) "4 ce mai faci", iar serverul parsează mesajul și îl trimite clientului conectat pe socketul 4 (puteți să lucrați și cu o structură de mesaj).   - Modificați programul server ca să funcționeze cu mai multi clienți. Clienții vor trimite în mesaj și destinația mesajului (acest lucru se poate face și fără modificarea codului clienților,​ vedeți exemplul). În cadrul acestui laborator, putem folosi descriptorul socketului întors de //​accept()//​ ca identificator pentru un client (în aplicații reale, clienții nu au acces la aceste valori). Exemplu: clientul cu socketul 5 poate trimite (mesaj citit de la tastatură) "4 ce mai faci", iar serverul parsează mesajul și îl trimite clientului conectat pe socketul 4 (puteți să lucrați și cu o structură de mesaj).
   - **(Bonus)** Modificați programul server ca să trimită (la conectarea) clienților lista cu clienții deja conectați, apoi să trimita clienților conectați update-uri despre ce client a mai intrat/​ieșit din sistem (puteți să folosiți același sistem de identificatori pentru clienți ca la punctul 3).   - **(Bonus)** Modificați programul server ca să trimită (la conectarea) clienților lista cu clienții deja conectați, apoi să trimita clienților conectați update-uri despre ce client a mai intrat/​ieșit din sistem (puteți să folosiți același sistem de identificatori pentru clienți ca la punctul 3).
 +
 +
 +<​note>​
 +O posibila solutie a laboratorului se gaseste [[https://​ocw.cs.pub.ro/​courses/​_media/​pc/​laboratoare/​lab8_sol.zip|aici]]
 +</​note>​
  
pc/laboratoare/08.1585557890.txt.gz · Last modified: 2020/03/30 11:44 by radu.ciobanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0