From 1d4e2c0361607f866479658a9615a4b385904dd5 Mon Sep 17 00:00:00 2001 From: hulamy Date: Fri, 10 Feb 2023 15:45:44 +0100 Subject: [PATCH] three times --- a.out | Bin 16744 -> 16744 bytes mini_serv_ex.c => mini_serv_2.c | 0 mini_serv_3.c | 102 ++++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+) rename mini_serv_ex.c => mini_serv_2.c (100%) create mode 100644 mini_serv_3.c diff --git a/a.out b/a.out index 3589a8e1a5b0bc403c69a5340b203e01bfe64fd7..567c8b69a130878f1a1cef37660ce2fc4f13bb71 100755 GIT binary patch delta 1538 zcmZ`(U1%It6ux(N({!Zm>}I=}{y}H`3sp!uO=6SA#9hpgX=w`uqqXisM37n}C@56j zWj9?{y-cTnCtxf^ss;)AV8WV;K{uO_vT5r}#fJ)8tq^bu3$`LLwYB59cV?5c;DtHo z-gCb5o$sF6S^EgJkI>PTRARM6ECwOkBqgYOO5}IaCK^hp-cgN-O#+zj*R@Z#o_MbF z#=;w?KihlgJG=aGZQ*cZKIva2)8oME3N!;oxFfC41hHn)ho-<;wIA*G{&gItSF)*! zBj;p{8Iu8z**TAQ~o-f^6lOZu#jOk#D~{sPZT|H0I+$=@v4NuFi; zMKe_~tT$)P-WmI63}qJjIyI_yq;_v%PHg$!_xeO}t8gZTGpwMX)v?VS3kmY~142s#=)!8wy zB5NR^MEaHw;rg@KMf5w?vz>7o);Ji zqOA(u1Sb(0^>GC<=?l3Es*@dosTM_R$83;nAS3tPR_9fCpIF$f+7WOY>=Mi`2-`1g zT38Tv7zSFE^`oNWY9w}R-AY2v!B}gFHs{}dqTiqYz5NqE-36?(Nvh5!2~(XtGyzf< h{)4M-Z35z5+od7zG?X9cdf!JcfE3?OPeMH2@E>xML8|}& delta 1595 zcmZ`(VN4uF6rR~T+Ae9c2iLNNs$E1SO`6gzU_sjJonh?~X<}lk7;Hk@05uVa*yTGKx@{=nw6He%c+XNnqIsLJ|gcCTR7P4>N+ z?|tvRZ{F;k*^kYBoLGnX_*%rCI4Qstd=IvFJ;?@KfeV6?y$wo!wg?iPyS_26E&ju` z$%jt%?h9{U`01OfH-DS*CVO1#1so-MVG0it)msgQd8^R%&F?BSf}Qp1}x4ag;LDwENNuD>8$1ZJ6|LtO?n*1};)>C|O;} zq?LKfgaO28VsxB_rosT3AN)a;W+G_}FpbJH0ez-XztE`9nu9c`WIy!-^UR$kHKrOT zFR~K476$I>n86VJ>J-^m| zXf~iq1|-ikgNTFkYHGW4nF(ZW0Acq+8RI~<9_Y@w%xB20O*=~*nL#Ggymtgc3zFI* zDMYKvx2HVkUC|JC#w z2nLBc89JFODr;Fih?~zr2iEJH}yQ{NZ>O9eLq_tb>YLgCkx1Z=}?L7W!K5RWs@ntY z=>?45vaB%p$py=50&jwUnc}}#)+pVB{{sA_UoDG$UgWe?wygpq8)gpe7ybH{SIjTTFEd{oM+*CgyvsI$} z1VlZk1dZNz+NWq1oX79Avzpv?gQr>L7n$v1Hq7iWvvJZ_Ef$ZljvJt`ooizPEzU4JSrs_wL896W&+B=dJ}V(YKqQl +#include +#include +#include +#include +#include +#include + +#define BUFSIZE 42000 + +void error(char *msg) { + write(2, msg, strlen(msg)); + exit (1); +} + +void broadcast(char *buf, fd_set *set, int max_fd, int server_fd, int sender_fd) { + for(int i = 0; i <= max_fd; i++) { + if (i == server_fd) + continue; + if (i == sender_fd) + continue; + if (FD_ISSET(i, set)) + send(i, buf, strlen(buf), 0); + } +} + +int main(int ac, char **av) { + int server_fd; + int client_fd; + int client_id; + int port; + int max_fd; + int ret; + struct sockaddr_in addr; + socklen_t addr_len; + fd_set fdset; + fd_set rdset; + char buf[BUFSIZE]; + char tmp_buf[BUFSIZE]; + int clients[FD_SETSIZE]; + + if (ac != 2) + error("Fatal error\n"); + port = atoi(av[1]); + addr_len = sizeof(addr); + + // socket create and verification + server_fd = socket(AF_INET, SOCK_STREAM, 0); + if (server_fd == -1) + error("Fatal error\n"); + bzero(&addr, addr_len); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(2130706433); //127.0.0.1 + addr.sin_port = htons(port); + if ((bind(server_fd, (const struct sockaddr *)&addr, addr_len)) == -1) + error("Fatal error\n"); + if (listen(server_fd, 10) == -1) + error("Fatal error\n"); + + FD_ZERO(&fdset); + FD_SET(server_fd, &fdset); + max_fd = server_fd; + client_id = 0; + + while(1) { + rdset = fdset; + + select(max_fd + 1, &rdset, NULL, NULL, NULL); + + if (FD_ISSET(server_fd, &rdset)) { + client_fd = accept(server_fd, (struct sockaddr *)&addr, &addr_len); + FD_SET(client_fd, &fdset); + clients[client_fd] = client_id; + if (client_fd > max_fd) + max_fd = client_fd; + sprintf(buf, "server: client %d just arrived\n", client_id); + broadcast(buf, &fdset, max_fd, server_fd, client_fd); + client_id++; + } + + client_fd = 0; + while(client_fd <= max_fd) { + if (FD_ISSET(client_fd, &rdset)) { + bzero(buf, BUFSIZE); + ret = recv(client_fd, buf, BUFSIZE, 0); + if (ret == 0) { + sprintf(buf, "server: client %d just left\n", clients[client_fd]); + broadcast(buf, &fdset, max_fd, server_fd, client_fd); + FD_CLR(client_fd, &fdset); + } + else if (ret > 0) { + sprintf(tmp_buf, "client %d: %s", clients[client_fd], buf); + broadcast(tmp_buf, &fdset, max_fd, server_fd, client_fd); + } + } + client_fd++; + } + } + + return (0); +} +