From 99eaa7bba9488774a0aac5856970ee58509cc8ea Mon Sep 17 00:00:00 2001 From: Joao-Maria-Janeiro Date: Thu, 12 Mar 2020 16:56:42 +0000 Subject: [PATCH] Added ability to receive up to 5 TCP connections with reasonable scalability Co-authored-by: Guilherme Viegas --- .vscode/settings.json | 5 +++ main | Bin 14392 -> 14464 bytes server.c | 88 ++++++++++++++++++++---------------------- tester | Bin 9248 -> 9248 bytes tester.c | 4 +- 5 files changed, 48 insertions(+), 49 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0f5b5ae --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "select.h": "c" + } +} \ No newline at end of file diff --git a/main b/main index d9a096f9f277d12991f14125bcc439aeb3dc5de2..1a9e150c51b8862148003d1b73a8eb61e0ed9992 100755 GIT binary patch delta 4569 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 delta 4529 zcmaJ_3vg7`89sM6H)I!+-A%IDT|jn|ki-DV<^>7(V53RBL9IcFwJ5TYB+5+1poxRF zbQ9OmZ0|%D&U6Y|6>UdrJ9W^^v@tT9B~})-YUsm)onmkb?us}8Q&?YYzyI937-RL! z&UJ}4D#osf4ScJbYJ9y?1_Cn&wufUQ&;t`f3vpYdJ1#$#|@4wCq{R)wOjciX@S(s zPa7QEV{}R{(@45S$g73i%=?XANfjQ^x(q&T$d}rLmqW|+oZ=YMlz&x_{~hWBxUncb3P9!!H=>O zRld&QVaht27B77$q6O$>ll9hyMR*4CLYY5Y# zCZYl_CTt|USKuPT8HD$wQUMUmBLz(?5f%=)gfj{E32Y`jhj6#R2Eti{{Q`eh0F1g> zqE+BCgw2F~0)I$&F5xPH-zQ9qlkiafRLQ%fz(TTwRXF^Wa1LQ6@au#vgs0Av|2Sb< z@5H3Qql9gQCj@?xa4zAfz`rA$M|iKmPZQ23yeA+OkCK88Y$7c1xZT6L!oZ?cpK1vm zx=jhauLS=y)w;GN7WL)(m=fDRkw;zZgw@C5A0TkL%i?ZgY~(#`cAHXh7@ZPK<|v`# z_st(6D%xS&`Y|%3CgJ=LTS)5luh7nRRg!{QgdEzG{*Mpyb#qI~G2C>iA|X$@&BGQU1)_Iyz1sCA2L*DtPErjL}huzmDmJarY#tiu2^tX{ys}-YbFj7>-smeCYQVG2kip8JA z6qH>`NX{gcDyQ<%Q2|TizX6lVknvvdVu`Ou-b2J5q&&a8kmqqwsPY&BBXrO~dMPx- zVb)6j36g`bFMBaB1y^%*m*MEb^{wsv3@&U*d zE9%M;M! zSiVOcru9>d|3>2(ljiUor7JP=Fb<}6%bfq$NBK zJrW+J4$r_t526_0w+PQD^kI0Cl`n5vaHN($^;o5OkUV~A(&}K4*mDjPh(ar@r%#-%huI~NRrR7c>{asD%g6C=3w7q z0nN~W2UljKgDODezhUZ%4bZFRf|2ySVgloECljtUCG^j@70SrRU?h)WL=HrIuT+MH zrs*OZY73{y&uA`qf?9AT{T_~ENt(y$vow!^B)Nm30VO1EA$omMDV_RaEVcR*b0H7~}8cpKWaTB$e6&FfyG=b)$bCsSl#R4W}xO{wX{JS(w8a^p~Ko zp?42@1sg^mStC5VV2R}8D+;`F_zXDsT?NI3N5Qt2UM!6{*6oI?vgzZA+5-I1G26^v zC~!+V_#wz~ej4(9ZgaS$!@SyYwak#iFx>BWB$J07mzk||eF$M}%FO32EVb>)(ja{w zQETFB7H*K7{Dp;X=>$KtaFt}`Hn-ar&h!a8eW+3M^G3Hyyk09_c_9ELPARbp&pS*(g5 zDzqC-n37cFkivv&=dyHRGeeB*A{NzW^mTnUSlSWogR~nhScV-yt&n!3jScesK$DPm z{&CSx=^*bfCfr|a=g$|fUfpf>&7@=Vfeb8%?VY8s)b&%d^i9x9_)QS^@GBQp@?^1< z_bs{;=@W|{kp}twC0-Z3xu{u%WNa}`OD|{{y_S%wcQ7Z8Wn@^7c}PG%aKn?=N#yFVN@wk)Ah0clYS}sag6; zijo?Iyiv$|NVW{XpH^$Re)z@H1g@Pr54~}z^$E$?Zs@7r*=zWW;2h;!E^$=9MzIDL zo0zpG?+8vSYt^eu&-pmTx;}-KWKslllEl=H%JM_^ZxU-!|v zCv}GOPv*tCwFObMgFf9qop%lNR_JH%-Fn@hzOAXH_qturPQN?Q%sEbKf8%5f0KDX7VgUSle zDr*Hr4f~cvCGM!W)z;qC!S3zcc=zUx4LuvXH*|Fj-&3(d;*m<pQ`bisxp1Tr-~n`sWA7HwL$J$R&Sov(WHHN-LmZxuBv0p@y`>FU-%s4uKIdg`q@A1 p5lXyu+Ux7_w%A?2O6ufC>Q|Ypg_ (b)) ? (a) : (b)) #endif -int fd,errcode, newfd, afd=0, second_tcp_fd = 0; +int fd,errcode, newfd, client_sockets[5]; int maxfd, counter; ssize_t n; fd_set rfds; @@ -26,7 +26,6 @@ struct addrinfo hints,*res; struct sockaddr_in addr; char buffer[128]; -typedef enum {idle, busy} state; void createServer(char*port) { @@ -56,72 +55,67 @@ void createServer(char*port) { if(listen(fd,5)==-1)/*error*/exit(1); - state state_first_tcp; - state state_second_tcp; - - state_first_tcp = idle; - while(1) { + // Clear all sockets to set FD_ZERO(&rfds); + + // Add the main socket to set FD_SET(fd, &rfds); maxfd = fd; - if(state_first_tcp == busy) { - FD_SET(afd, &rfds); - maxfd = max(maxfd, afd); - } - - if(state_second_tcp == busy) { - FD_SET(second_tcp_fd, &rfds); - maxfd = max(maxfd, second_tcp_fd); + // Add all available child sockets to set + for (int i = 0; i < 5; i++) { + newfd = client_sockets[i]; + // If there are available sockets + if(newfd > 0) { + FD_SET(newfd, &rfds); + } + // Get the highest file descriptor number + if(newfd > maxfd) { + maxfd = newfd; + } } + counter = select(maxfd + 1, &rfds, (fd_set*)NULL, (fd_set*)NULL, (struct timeval *)NULL); if(counter <= 0) exit(1); + // If something is happening in the main socket, it means there's a new connection if(FD_ISSET(fd, &rfds)) { addrlen = sizeof(addr); if((newfd = accept(fd, (struct sockaddr*)&addr, &addrlen)) == -1) exit(1); - switch(state_first_tcp) { - case idle: - afd = newfd; - state_first_tcp = busy; - break; - case busy: - if(state_second_tcp == idle) { - second_tcp_fd = newfd; - state_second_tcp = busy; - break; - } - close(newfd); - break; - } - } + //inform user of socket number - used in send and receive commands + printf("New connection , socket fd is %d , ip is : %s , port : %d \n" , newfd , inet_ntoa(addr.sin_addr) , ntohs (addr.sin_port)); - if(FD_ISSET(afd, &rfds)) { - if((n = read(afd, buffer, 128)) != 0) { - if(n==-1) exit(1); - write(1,"received: ",10);write(1,buffer,n); // Print incoming message - n=write(afd,"Server Response\n",n); - } else { - printf("\n\n\n\nCLLLOOSSEEE\n\n\n\n"); - close(afd); - state_first_tcp = idle; + for(int i = 0; i < 5; i++) { + if(client_sockets[i] == 0) { + client_sockets[i] = newfd; + break; + } + if(i == 4) { + close(newfd); } + } } - if(FD_ISSET(second_tcp_fd, &rfds)) { - if((n = read(second_tcp_fd, buffer, 128)) != 0) { - if(n==-1) exit(1); - write(1,"received: ",10);write(1,buffer,n); // Print incoming message - n=write(second_tcp_fd,buffer,n); + //Else its on some other socket + for(int i = 0; i < 5; i++) { + newfd = client_sockets[i]; + if(FD_ISSET(newfd, &rfds)) { + if((n = read(newfd, buffer, 128)) == 0) { + close(newfd); + printf("Connection closed %d\n\n", i); + client_sockets[i] = 0; } else { - close(second_tcp_fd); - state_second_tcp = idle; + buffer[n] = '\0'; + write(1,"received: ",10); write(1,buffer,n); // Print incoming message + n = write(newfd,"Server Response\n",n); + if(n==-1)/*error*/exit(1); } + } } - } + freeaddrinfo(res); close(fd); } diff --git a/tester b/tester index 080dd0f00a8ec5cc40d038d6b8309616ab54a301..b80002e48494d34b6f1fc594c8e1a90ef13e07d6 100755 GIT binary patch delta 464 zcmZ4BvA|=(1IpgND^2MsoNu|+VlZ2|K3@0$FA{U_s*$&WbH!getOP1$z_B+Lk8 zz1Z^S|NoZ;|Ns9_)8m(K0o%YY@4~>~815M6*!kZv)G@@TSM?l=0z;@ruP%rV_U!!T z*?HAR^QlMk8xD_yf0j^&bOoG`hP%bjt@=7U`7%##K992l2u4&*z|%(!H-p^zxE0K*0#EzWoW#A6X+ z;NaSvB=n7u@yFyyk$#})OA&X*1(OX$uLIR{id|>iF!`aFIHSSjpJMflyEj*gw{tKW xO=eWk=Uf5}@+Ffk70d-UKzSRW5h6Fa5vT?cEjty=xj48SKu!l)`Ab2K830vYmLvcG delta 456 zcmZ4BvA|=(1d~tUqJup10 znul>R8>{>UZIJc(OpvH+h0W6S11zT?b{Et3s}M41H`CID%1#x-D`5W@oyy}3;25hLS; z$&n)cK#7+k?u-qS4Mnd5wQ!1E2ipEnOq@|*@=vjP#^swU#oIX;g(fp9=ySF}gSut1 lrGmNO1SoF;G$LdsHv-ilqGP9mIoAWIng^Vle<`Rj0|3WYkS_oL diff --git a/tester.c b/tester.c index d4a5d6c..9855815 100644 --- a/tester.c +++ b/tester.c @@ -10,7 +10,7 @@ #include #include #include -#define PORT "58006" +#define PORT "58012" #ifndef max #define max(a,b) (((a) > (b)) ? (a) : (b)) @@ -46,7 +46,7 @@ void main() { n=read(fd,buffer,128); if(n==-1)/*error*/exit(1); - write(1,"Teste: ",6); write(1,buffer,n); + write(1,"Teste: ",6); write(1,buffer,n); write(1, "\n", 3); } freeaddrinfo(res);