From 4acfad7d45fc8e61001238b1414ae4b462721f42 Mon Sep 17 00:00:00 2001
From: Gianluca <gianlucamastrolonardo10@gmail.com>
Date: Thu, 23 May 2024 19:32:12 +0200
Subject: [PATCH] da finire

---
 Reti/Laboratorio/Assigment5/Calculator/client | Bin 0 -> 16800 bytes
 .../Assigment5/Calculator/client.c            | 134 ++++++++++++++++++
 .../Assigment5/Calculator/makefile            |  10 ++
 Reti/Laboratorio/Assigment5/Calculator/server | Bin 0 -> 16840 bytes
 .../Assigment5/Calculator/server.c            | 131 +++++++++++++++++
 5 files changed, 275 insertions(+)
 create mode 100755 Reti/Laboratorio/Assigment5/Calculator/client
 create mode 100644 Reti/Laboratorio/Assigment5/Calculator/client.c
 create mode 100644 Reti/Laboratorio/Assigment5/Calculator/makefile
 create mode 100755 Reti/Laboratorio/Assigment5/Calculator/server
 create mode 100644 Reti/Laboratorio/Assigment5/Calculator/server.c

diff --git a/Reti/Laboratorio/Assigment5/Calculator/client b/Reti/Laboratorio/Assigment5/Calculator/client
new file mode 100755
index 0000000000000000000000000000000000000000..9370d342872f7b132d6304237f6d97e5426ea6a7
GIT binary patch
literal 16800
zcmeHOe{dYteSeZI5XSbMiJchp!)ph3L_mjR{6lsyK3SH%qBaODB~F{LTHURrt?w6i
zdq!p&A|e!|3K3;GP&cJhkqHxLlFTR_(z>*eb10Tbr>We|Bx*99Q5eYRLLl;yv}&68
z`u)E5zWesJx1`PVuZ*5X_x*l9-yiSS?tA-o-}_Yiu_LuLHH^|Kb~i(*aGgM+Qn9d4
zGC-oNg{_0%t?XuY709bOCiGE3Kr7OGZ6&Rj_$r|2w;7o#^hN<QqEtep=oggc*9Z+!
z78Wx4)gdcoKfSPC*bybYo1Z51%tvpR^&{%_!?w{Hg`akyk}gTVu&h7%A&h=a(yvMS
z5naLpK_W`+iEV=aEi#^;HlY(FqJF;t>F1}1g&QM^d0;y6rW5~7^6Qj-`Zf{APj?BJ
z5vBa@2S03=|81gfen93I)DH`?ABf84Wp^a(-aWhSNW>cxb}B#EIM}kManG(uE*;s)
zi-6_Q;2*E4qxW_*2vb0ey0dmj$P^EC8>JrYzkK8O_WsdF(!c-VLbvwL?QeYTsp22+
zKpQMK`k)Oaj3<l8W#q4if3)H4QS%t$wTNwj|4Y_)lKV>Iblae=BHaX%ytOOv%OGhL
zh!E}vQqBI)0`QLq;Lio%*#LZR06rLij|SlP1mGVDz_I<S)%Pz0@H+zVJpuSS=r|2@
z{?raYwR~d%_|pOSrU3l&0r-sp<+(e+9?aQx`1hyB0N4OmpcWMx8ef=U#0E{H&rX>M
z`w@#}Ei=wy=~T*!IiQ2PEN0{!GwT>h(@wFRlZ_=atS^(bQ%)btrDLZohnY^=W=SiV
z13r^?ax9ie=PWc%SSg5NgWbM;MlNQi`q+SzPUToGMIoHHmCdq#%W>?amF|n1XP7l;
zJFM^FtnFCf4cW&|8L@#=MxSXXn4Pj5!;HtX3=4;M{2q4nSjV9@V`pTq%k6Txosr!x
zf9Eb{baWjzAWN&?&N)`L>v&rtowB;j-UQ~=pG>D@eGOq+)e!Ib8o2lIZ?&XCqF>b3
zNex+I%h!PY-vOoZ?*q2I4o9hr65Gh-)of16`7QP}ILdrq$}fEG85mY-*^fZRMDrH)
z=hXWI-XP~C!h0lM9~FASNuEC_a2&Jn8ltq|!M)?$q6gnV#z2=m_y;`rvIobpkP=;w
zI8NjENU25IUkw0_*{F+pa2$^*=^mUvM@U7d2gkZmI_beN4@x~AoZ1L=10EbY#7!9w
zE+1{UZqS2Y>sm85<iXc^@KFyA7lfN8J-B=X;<~dQJmgw4Hs!(T8bkFt5AGeuraid4
zM0m9G9vtUIN(B#&V;QAc5B`1vfzEmG%^rM(U1@=p7FcP4l@@sK7I-&w^Dp$_pVaH)
zb^i*_vieBDsV&dx!+&4@3U@5;t_8SM-mwZuXe&ee0o0U=KP;EalU&9Ly;Qv9$~cji
ziWgiNC)iT)>#mFwYpM90E8~P(Dt^wDaUv}hA9H1#Kug7kTp1_MQqgo}oG?qp`&}6)
z%2Kh_m2rYB6`NfdC&p57n=9jlSSoICWt<30#Tr+}39wYWe1+<Z6Cc#ymGJ=u>hH=p
z0Yd#<87DrdKgrOVpNwE@9%j5fLH-&n_r3D-KKajm^3y(f!Y7aT<WKtKyiZR0WXmUi
z!Y6n8<l{cM-6tRL$-8}Wqfg%9lW+3Lo4j)K+Z|(<9@NKP*N5L&>g;N7E;PTUPaOC*
zw0e2dySFp;v%W}Z>*FB81wL`$dhpdJ>aIhwZ`s)dm;QIb2rvC>$_t^bLumJkq+nk}
z<;3pSk=%MkA6wEdymL^$u)IpIxu{>d;%tNf&&vSy<%K@pkK~W{$IyY7K+W>Eb?d_i
zK8>tC_NKE|A3yLJ5EhHSDwh}IaIsyidm7}LPk^tRKl&FR1|>4x;HN+KlMLKHV=q1X
zU*)ns_Kis(aeaLCjs_mLeYv@y&x|Yq3NizBS+VSwE?TeHuwpkWR#R+)Vw)7(qS&Zn
zb;Win_M~Ea6g!~UjA92BJEYiA#ZD^rtYW7Wdrq;_iaoE`f?{VCJEz!r#V#mzQL#&k
zT~;iEo|LU#uh_6+H!D_CY=dH(6x*WMsA6@+b}IIyVtW)jpxBIJ2NgS{*ipq!D)y{m
zrxbfmvD1n@uh@cOXB9iA*m=b+D0We?ONw1qEQ1l0+E=k*#co!trq~9>HYv76u~Eh9
zitSYFNyYXkc0jQi#SSWVNU@`eomA{u#ZD>qoMNXHdtR{x#m*{rPO<ZfT~O>Iu@iOc
zU<%d8X3k@4F3$cZj3g5yU*rSIMI0Kv+IxOcE{}8NNFl%Gn>g1m9zpDB?l3WeeKmGT
zpV;&Rn5SRH)x8_}QHVS<@>Mwk&5TUD+zV<{TB2gXSfyA7V;=RjV#A8vtXNI44T^12
zY>Q%}iq#d{so0Z>?NRK2Vl#>zblLVHQP}oTNhc*eE9sP^=Omq$ly`wX(_WDBtfX_2
z&P%!==_1l$KKie6cIx9JI05M6VVHzEe+Qa=V%<mK@kt;1j@t?La=9$J?X$qWh!0mU
zV=sOaAJZ1U0@xVuqT!dYqssY42vvun#xA^g0~y0rv4zK-Syb^3f-e})?-0iLSi~cP
z@io%;E^Z<UIb48J;>EG}qyNB6@oIqUZUM-P+!y@0x*ybiGh9*2sEWe{cu3{yLGJwq
zxQ+7|p}#Ib%+kMu)7Z%CJm>@l9p}~Jp`ks%<S)1*UV6hX@e43C@&sl%QFjU+L9t*-
z2m(dIOB%&TQ5^f0J~4rah$ljI3Bv-!dYOtn#jy#T8)VkvX27gpkbyx5cgk*_-FGpI
zzXb(6dDw65hn9Tm7SWP7Lr7}LAH!^qhFCul7KCmPM4zHRcy>uoeAFe+f03T&(HIN4
z_!JsL^{^BW<x@Y$+w&aM0ky>|@FTS^V#(c#eGlwV0fv=|m${<uVUdv-O&(Fk`WTKT
zV_xkqK^yuj9_sNzeg~BN^B)v-2I7|dL0R%EVExt~$gHu%Z~qKS&N~DO<L!`FPy_u`
zt?~EDBJpZtk+yq_^cr{$^H!)4<J>+jgr3BKscN-ncwW2`(3wAk<xS<V_k=8qTSVS!
z;=;M%J<9o68CP5+_-Rld;}^*@pn!`6@61!%MRR#O`p0l5W9$4An2C;l-V+HF&%8^G
z1;X`0HwUG2d-zQ-fEx|5zR*u!E9s#R&4N5H<O0ftQYgG>9h9jQdhlDN(8&v+$IBn=
z{~7gjAkTXJ!TzRygOY*$KY;zWOQDZnD1|nRoChPYMbf8-QU&ObFNg}9$6;x4ACyIm
zisRkOas9T9{L$8_TV$Yk?G>?R;%ioSl?rYv={IVD8u@jxBbBqVcGlADgqF%Dt!!G0
z+Zucz$(oPY>6E=+V>{xkJ7@M=`?Vc8?Jh7sZDsG)?#iUI&fRNRTRNYJYpJxO#o!x{
zV`-))zTRwG!%pzeI8qS@piO)L(sKD&%*y5Z@`-J-^qw%%#z|}VH3rPUv9;}YSx4$L
zd`pUJ$b+ED4R9K25I42c>4cTl?9^%71i(yaqO@3voXDsnnMvnzcCVd)DoeY3%G9!U
zKe*@9j=7DkS<@aHNMm)^utOhfXD6V_cFfYc;6oCik)3@a*3jdT)|wkueHg!4<ExDM
zcgp1fpbbm#!T@LsP@MJ$FPF=mK+RIQTmXuR-hJ0R@&KzD4A<PS_UigcxD61;kGLB6
zz+BAO;j3|qWVgUS<}(0!bmHx@K73^T=6gcdK3qS<4sO~1p*wGZ0YdoWx7f*_mdo4`
zK}Z<af&Wp!qv$Ua=Jh1}|0(2m4UR4C>%*U^ZCiKMDt0XtNm{Ltl@?fOft40mX@Qj%
zSZRTk7FcP4l@|EzZUNfwMEjfQks0?`VOlGQyWwh`lwZJCIFM*B678eH7iyU3iJJB#
z(S9m?4#!0LpI<4bQJ#i{Hzr(PVCsSQYnUWq^HNWHg!agS;-fsK&4MuRo*IOt8`BO7
z16YXjv>^R)y?_Zn!D6C4SIe@1glkf!a`V@gU{8CQD1X^3ZvEgT0Iwfp$6eu-3zz3)
zV0a-(dY(TlrMUcz)WZvAE>k_Y(f{KQ?Ys7eY?6zrsHB~e_DGtMbV$-kNv9;8mb4)0
zoTLkqE=dZTDtQV^s!7@;X;jiqNqZ#qm-pAn^-*DQw5@Hw*3jLXPdRz5xjC{c($v_T
z=VJ4tJ9kE!cHJuB_l}5{&uVs=zgYBI;`M-g6rYqGrb#7!BClqT*Gnx6vnB7QGQc#6
zYu-&|fZZu^x?e%$sRMp%U<Y7BRLJu3X5AcrKco9kXc_xMU@%|0{|O)E_M6;&k%WH<
zm}=z@s@F7+vynCM)jCBHv|1c|Q&$6bpZ|KC;V$oEw2z)5;eO5<xa;Y@CVUAPUsG~b
z(7xoip`kP!#iA5J&|3ko7Uv=iAl2~wU>}A!VPBk9j8nUT(RfL@91V#7djWVp0N)-^
zo+kqApAEpj5rEGI;NK6x-vS)l!QY<C0ru+y%D*iD-wn7%jp(6=0p9?p1n52|)%}QL
zk4YzZG0syD;9<C5nxYbr<T5X3*gYS_-%WwelJ@@oeF*UDAkvrReahc0f&FQYSH?!^
zi2!^m0RMUb{%Qb@=aH}-{N;QDaP5B<hg|`Ddlme87{9Koh1s9RX=$?+@M`<uccOij
zIP63$>oiBwus7W7wGGGYX8`1!d|zKA#?(G?!$}&j>pf-Vz%rgT`V;A1GhxJ?bT((0
z`9auIpUfmI$BIXqs$1Y5eA_UyS@VoxrJU>;)|WMtmJ!b<lV`xiBN<=`d*D5$v4jmi
zP$I)P@<8kHcBB2?!v^eNKm4(KTaS0N0SpILjCNgW^}`P^<LI&b4z(UL?mKeiM0=Of
z)q3byJ9zlF{6}eT{jb?OkNf^zTikPRSaH)a8LyT+3Q(!{ZR~fIyTlOzSH@s;T%ZE<
zo*Af6h@%J<5I>Pnf#6Ap3IO^I3M_X2t5XIQCgS)*1tgC`RAByd1V%iUHU`X89M2eZ
z+y`02?Ua$vS#fBk6#N*yxtz?HAG5#%6~2hxGZe0BFFz{bir7-}>_!D9j#5-Wh5;uZ
z=qkY@5mnDQR2~kg41m`l^edj;s8EQn3KbBG<jy1=vlpn76?A|&I7eb-Gb{pMCag$*
zDj&&Y(-|x4obf=tc^eLT*>MTA9_nbs8<Cq2n7IKKiJwV97J@oip@GjIIrubEAsC>`
zS_u;!B$r7zEW#@j0XEW~1`(N@6=M;{8UzvVOt4P#3p!#A$a`@B&Y-xGh#_uD;XyoP
zWhQM1CfuQ`Sp-IdB;2so2AuyJhU*m=@)-<+Jo(RS(t1Uzxh?TXKM4Q$s80St=MvEt
z6RjVF#2B8V^7{MFC*t=IZ=(5&FnsRw`qOhKQH=~G_4|JmaQJARrt;G|jA(=Oqji|S
z{3hse4MzU7P9r)h6<9`WXY!}@k_{M49j-sE`-svy4@`K%7~b>{2)Kr#{At}p6x$aQ
zm7na0J_<TqlaWm8GNPT_TePva{1Rppz+jt_za}e4l-7xqzrX%}BK;4^fVA!;x*#iz
z{@7-I|K|Wh6N>N7*K*#b^*EUD<nRAy0rmQ8(vK+r1}A-y(BlBnFZuj4a(zaW>?j1u
zM5lfJL(-pURMtPp|8IQ$1^Ey{v_vlmWB|&S;^B4zZ~f^xohZHUAbWrNy(;~w|CuH&
zCDnc9r~Z>x>>q(a6Y{5Z4$)m?D5*dHANc%-wh2R`U-kL>^M4ccxE&ntK}_@>ht3oG
z?MWtj8GJ(UPyV#dY-q%2>UtHDlF9#9pulUF{AvA1=fmk7IF28f$dCH*D}Z79kw2{m
zwL8$7u?7CCe#oEbRp9LPXHjX}Bq-%W5y+3^wcw1Hn}1Yj!U6u8P`keyWd73J#mWCR
z7ZD7W6_c0JwIej*H!1^0<qI`B7ft1-@fY7$P}#lyL%W64?o(2}WQ(_}&xEU9Z4nk*
Jd=5U5{Wp0BX?6er

literal 0
HcmV?d00001

diff --git a/Reti/Laboratorio/Assigment5/Calculator/client.c b/Reti/Laboratorio/Assigment5/Calculator/client.c
new file mode 100644
index 0000000..02a6abf
--- /dev/null
+++ b/Reti/Laboratorio/Assigment5/Calculator/client.c
@@ -0,0 +1,134 @@
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+int main(int argc, char *argv[]) {
+  char valueToSend[256] = {'\0'};
+  char valueToReceive[256] = {'\0'};
+  char iterationsServer[256] = {'\0'};
+
+  int iterations;
+
+  struct timeval startTime, endTime;
+  double timeServ;
+
+  printf("Inserire il numero di iterazioni: ");
+  scanf("%d", &iterations);
+  if (!iterations) {
+    exit(1);
+  }
+  snprintf(iterationsServer, sizeof(iterationsServer), "%d", iterations);
+
+  int simpleSocket = 0;
+  int simplePort = 0;
+  int returnStatus = 0;
+  char buffer[256] = "";
+  struct sockaddr_in simpleServer;
+
+  if (argc != 3) {
+    fprintf(stderr, "Usage: %s <server> <port>\n", argv[0]);
+    exit(1);
+  }
+
+  /* create a streaming socket      */
+  simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+
+  if (simpleSocket == -1) {
+    fprintf(stderr, "Could not create a socket!\n");
+    exit(1);
+  } else {
+    fprintf(stderr, "Socket created!\n");
+  }
+
+  /* retrieve the port number for connecting */
+  simplePort = atoi(argv[2]);
+
+  /* setup the address structure */
+  /* use the IP address sent as an argument for the server address  */
+  // bzero(&simpleServer, sizeof(simpleServer));
+  memset(&simpleServer, '\0', sizeof(simpleServer));
+  simpleServer.sin_family = AF_INET;
+  // inet_addr(argv[2], &simpleServer.sin_addr.s_addr);
+  simpleServer.sin_addr.s_addr = inet_addr(argv[1]);
+  simpleServer.sin_port = htons(simplePort);
+
+  /*  connect to the address and port with our socket  */
+  returnStatus = connect(simpleSocket, (struct sockaddr *)&simpleServer,
+                         sizeof(simpleServer));
+
+  if (returnStatus == 0) {
+    printf("Connect successful!\n");
+  } else {
+    fprintf(stderr, "Could not connect to address!\n");
+    close(simpleSocket);
+    exit(1);
+  }
+
+  // Inviando il numero di iterazioni al server
+  write(simpleSocket, iterationsServer, strlen(iterationsServer));
+
+  // Avvio il timer
+  gettimeofday(&startTime, NULL);
+
+  // Aspettando l'ACK
+  read(simpleSocket, valueToReceive, sizeof(valueToReceive));
+  if (strcmp(valueToReceive, "ACK") != 0) {
+    fprintf(stderr, "Invalid ACK");
+    exit(0);
+  }
+  printf("%s\n", valueToReceive);
+
+  int i = 0;
+  while (i < iterations) {
+    int num1;
+    int num2;
+    char operator;
+
+    // Pulisco i buffer
+    memset(&valueToReceive, '\0', sizeof(valueToReceive));
+    memset(&valueToSend, '\0', sizeof(valueToSend));
+
+    printf("Inserire il valore da voler inviare al server con il formato num "
+           "num operator: ");
+    scanf("%d %d %c", &num1, &num2, &operator);
+    if (valueToSend[0] == '\0') {
+      fprintf(stderr, "Impossibile inviare una riga vuota!");
+    } else {
+      write(simpleSocket, valueToSend, strlen(valueToSend));
+      read(simpleSocket, valueToReceive, sizeof(valueToReceive));
+      printf("\n\nEcho: %s\n", valueToReceive);
+      ++i;
+    }
+  }
+
+  // Invio il BYE
+  memset(&valueToSend, '\0', sizeof(valueToSend));
+  snprintf(valueToSend, sizeof(valueToSend), "BYE");
+  write(simpleSocket, valueToSend, sizeof(valueToSend));
+
+  // Aspettando l'ACK
+  read(simpleSocket, valueToReceive, sizeof(valueToReceive));
+  if (strcmp(valueToReceive, "ACK") != 0) {
+    fprintf(stderr, "Invalid ACK");
+    exit(0);
+  }
+  printf("%s\n", valueToReceive);
+
+  close(simpleSocket);
+
+  // Spengo il timer
+  gettimeofday(&endTime, NULL);
+
+  timeServ = (endTime.tv_sec + (endTime.tv_usec / 1000000.0)) -
+             (startTime.tv_sec + (startTime.tv_usec / 1000000.0));
+
+  printf("Service Time: %.2f", timeServ);
+
+  return 0;
+}
diff --git a/Reti/Laboratorio/Assigment5/Calculator/makefile b/Reti/Laboratorio/Assigment5/Calculator/makefile
new file mode 100644
index 0000000..f0ddf27
--- /dev/null
+++ b/Reti/Laboratorio/Assigment5/Calculator/makefile
@@ -0,0 +1,10 @@
+all: client server
+
+client: client.c
+	gcc client.c -o client
+
+server: server.c
+	gcc server.c -o server
+
+clean:
+	rm -f client server
diff --git a/Reti/Laboratorio/Assigment5/Calculator/server b/Reti/Laboratorio/Assigment5/Calculator/server
new file mode 100755
index 0000000000000000000000000000000000000000..ca77de42d76d51f4fb7d79f062bba3f5669284ca
GIT binary patch
literal 16840
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

literal 0
HcmV?d00001

diff --git a/Reti/Laboratorio/Assigment5/Calculator/server.c b/Reti/Laboratorio/Assigment5/Calculator/server.c
new file mode 100644
index 0000000..01e11ec
--- /dev/null
+++ b/Reti/Laboratorio/Assigment5/Calculator/server.c
@@ -0,0 +1,131 @@
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <time.h>
+#include <unistd.h>
+
+int main(int argc, char *argv[]) {
+  int simpleSocket = 0;
+  int simplePort = 0;
+  int returnStatus = 0;
+  struct sockaddr_in simpleServer;
+
+  if (argc < 1 || argc > 2) {
+    fprintf(stderr, "Usage: %s <port>\n", argv[0]);
+    exit(1);
+  }
+
+  simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+
+  if (simpleSocket == -1) {
+
+    fprintf(stderr, "Could not create a socket!\n");
+    exit(1);
+
+  } else {
+    fprintf(stderr, "Socket created!\n");
+  }
+
+  /* retrieve the port number for listening */
+  if (argc == 2) {
+    simplePort = atoi(argv[1]);
+    if (simplePort < 10000 || simplePort > 12000) {
+      fprintf(stderr, "Port must be in range [10000, 12000]\n");
+      exit(1);
+    }
+  } else {
+    srand(time(NULL));
+    simplePort = (rand() % 1999) + 10000;
+  }
+
+  /* setup the address structure */
+  /* use INADDR_ANY to bind to all local addresses  */
+  memset(&simpleServer, '\0', sizeof(simpleServer));
+  simpleServer.sin_family = AF_INET;
+  simpleServer.sin_addr.s_addr = htonl(INADDR_ANY);
+  simpleServer.sin_port = htons(simplePort);
+
+  /*  bind to the address and port with our socket */
+  returnStatus = bind(simpleSocket, (struct sockaddr *)&simpleServer,
+                      sizeof(simpleServer));
+
+  if (returnStatus == 0) {
+    fprintf(stderr, "Bind completed on port %d!\n", simplePort);
+  } else {
+    fprintf(stderr, "Could not bind to address!\n");
+    close(simpleSocket);
+    exit(1);
+  }
+
+  /* lets listen on the socket for connections      */
+  returnStatus = listen(simpleSocket, 5);
+
+  if (returnStatus == -1) {
+    fprintf(stderr, "Cannot listen on socket!\n");
+    close(simpleSocket);
+    exit(1);
+  }
+
+  struct sockaddr_in clientName = {0};
+  int simpleChildSocket = 0;
+  int clientNameLength = sizeof(clientName);
+
+  /* wait here */
+  while (1) {
+    char valueToSend[256] = {'\0'};
+    char valueToRead[256] = {'\0'};
+
+    simpleChildSocket =
+        accept(simpleSocket, (struct sockaddr *)&clientName, &clientNameLength);
+
+    if (simpleChildSocket == -1) {
+      fprintf(stderr, "Cannot accept connections!\n");
+      close(simpleSocket);
+      exit(1);
+    }
+
+    // Leggendo il numero di richieste da svolgere
+    read(simpleChildSocket, valueToRead, sizeof(valueToRead));
+    int iterations = atoi(valueToRead);
+    printf("Numero iterazioni: %d\n", iterations);
+
+    // Mando ACK al Client
+    snprintf(valueToSend, sizeof(valueToSend), "ACK");
+    write(simpleChildSocket, valueToSend, sizeof(valueToSend));
+
+    for (int i = 0; i < iterations; ++i) {
+      // Pulisco i buffer
+      memset(valueToRead, '\0', sizeof(valueToRead));
+      memset(valueToSend, '\0', sizeof(valueToSend));
+
+      // Leggo il valore ricevuto dal client e gli restituisco la lunghezza
+      read(simpleChildSocket, valueToRead, sizeof(valueToRead));
+      snprintf(valueToSend, sizeof(valueToSend), "%zu", strlen(valueToRead));
+      write(simpleChildSocket, valueToSend, sizeof(valueToSend));
+    }
+
+    memset(valueToRead, '\0', sizeof(valueToRead));
+    memset(valueToSend, '\0', sizeof(valueToSend));
+
+    // Aspetto il BYE dal client
+    read(simpleChildSocket, valueToRead, sizeof(valueToRead));
+
+    if (strcmp(valueToRead, "BYE") != 0) {
+      fprintf(stderr, "Invalid BYE\n");
+      exit(1);
+    }
+    printf("\tBYE RECEIVED\n");
+
+    // Invio ACK al Server
+    snprintf(valueToSend, sizeof(valueToSend), "ACK");
+    write(simpleChildSocket, valueToSend, sizeof(valueToSend));
+
+    close(simpleChildSocket);
+  }
+
+  close(simpleSocket);
+  return 0;
+}
-- 
GitLab