From 2454b02a85541c34b880de61d6c53651b3fc576b Mon Sep 17 00:00:00 2001 From: hulamy Date: Fri, 10 Feb 2023 15:23:28 +0100 Subject: [PATCH] twice --- a.out | Bin 16512 -> 16744 bytes mini_serv_ex.c | 110 ++++++++++++++++++++----------------------------- 2 files changed, 44 insertions(+), 66 deletions(-) diff --git a/a.out b/a.out index 548915322c14be641a218c55e88873ca1c6577ce..3589a8e1a5b0bc403c69a5340b203e01bfe64fd7 100755 GIT binary patch delta 3615 zcmZ`+eNa@_6~Av;7IuT#FVkf;%G>xc>NvZs0vf>VOX7>q24~`QY>lZ>zn7M$fX@>OZ#~AP*<*Aw7qIr2(p)cX5+m=pe402i;1~nHF+x$_XCo z2%1;w{t+9<9)oUyZik)?-Ds%eruVZvxo((!;j6ZTktgYTb3T_xx0*flC77+p8TTF9 zY7TH)*?bk!>~~=a5BhFyCqsjb)-YPZ==YJ*Ua+x|@nJ?6BVBR?R=dC<-X*|{koAlL zITCJ&)RJ&*^A)>gw7<5jvf{GP<^iY^vD&-1C)d z{A>Khq_T3){(}c98zWWWNM$9MGLbCkvws{hXK-npBOGY8fVL6Tj#EE_SeeO>b?kSH z&m!$Q-?X3s(!@mGG;VAvB!DO#VH5qW#pBh}h@ts{z(%|)j(%!6;?>iNp;Cr4m+sGr zZ*9&%@V<-|%fJm+QFbB&$6PR4n}K7v-_ISlv^%Dr(U!dyAfz61X_D8VEjx-l=Fg;q z@nPgK&n5}u_abjcerkq(?pU--a0^6x;un5GzOM7z3yy<`kgx2E?_Hi{+xmK7cWDFC zh`SFpq{LvvdJzF_ysqtX-K?^`Kp+E5zxDGT+TiqYJydZnbbka}kS6ywN&ZYd3cmb4 z`#1DMr{H$aXqu!nO-b^lizZM}zr0WLT;6CrB}j71v?Mo8$=g!$7ImX6P7I6Vph6UJ zyi82llfO3Rsy%@ZVNx-G2^}~JfTW0EUAzXXJ`{lOx^q_^0`QtteN|G-BOn{ikbz`W zzFyaluT=WW-z53E2hAiudJEPmY&H0DTOIn3rqvB65H*pD zU?!^m5+FJ8HtLDv_6yNzbw4V}i8Bbbq@?5r%*apC1!f>V{lDAYWv5OJ;4hMT5)3>_ z>90m4q+}u=tVwd>#Mv2bIMD$Vy;c$(g)oKqI_&Y407wecP?D%24Vy=FE#NSexRBPk zOQLCOCqKqf5mT}_HY`q{E`*>HmnJ_zQGW~|_050d4UNTzIe<|b9DG(DtdK8N$U|xy z3dNL>8&apF9RHY^kP|V`&6Ft&k+1hhACVsCV5`~iNy&8lc7u6YR25M*c95^hLw)J> z-Ns{%WZJCg&MO8kT=w%00%fvDJ>lPBl=syW6i@Q3Rg!el6EqEa3zjoK>w)3l_jkV#! zwc%2}dS65Bfe62>hTq%N7~!kJ;fBMtH8%2p(quK?IbIDq|@qZ-mZ+ zK?g_QE}xg1fk8>RYo3Xv3NiXQ4xDJl<|N zFHgLrQxJ@mY+QoU&BY*ffD}KmnXMe~M^#|YA#QSzPS3;o5?bS4VRS#EKV-BG>7rlh zyUg{W7jRZ3dht`@G78TgDZpJOSgQxvxaoIwn?}*UTn|I3Zf9;}UO+qG1C~12SjNHlBEt!Nr^v~D z7d_z)G8$vF1F5$gbnujOZJwiCv4^{WI<&C(Uk)sAg^cQzE-k4yW3fx4CC9A0!w0Ks zs;e3!^j^uHRjlI8R3=rCgAES>dWC$xW?dKe{?k0iy+M7Y0h^KYf|>3pEpZwtUXM=* z+BiL38gLp9LDFABAH4}EBsJ3^dd{z)zOsOAg^ohz?#Rojd+5ud5EPVMp^%jX)5}KaP0$!APIG^tK4G1y KeLdYFEdMWb`d>%@ delta 2260 zcmZ`*du)?c6uT9|)4D!ENXmjKGG_g<>Sz znA6p6Wb7EC5yMn`@t35aQ-RHa4rFQrCdP=#G?0{J!4emoL|4zbZ5b|lmUGTMzx%uA zyZ83odl%WyJ34uPhB<0f8A;qSHd1nM>3ecCRe&rCCT=-6xk%5oae!;V%zU@3Mz+=0+Ol2P-E7C^9nbFE%eFV~_HAx~PjyS$m)Q&1n%e3W zE9;lp3*4-}e#?&5mipbkO}l*c^^{R!nmd0Smp&V5aDg1-Mr6^(k-U2F5UyCuTCh!6 zTV^xvl!on1#3w|*#JVvifvu_Ow#08LfaywAc(K>emulq_yqmg*r@{ScRxU$fT36_l z)tEM5jDpj&uud_nEOzftcE+Zf?1t-|-WPO$)qIkPUeDW{> zv5BVsvrV&PL$=D!2!7{{9{A9d!+YSOX`$t3`~+*WZ14uIMV^nvVqc|Pgg;HHW#vpP z<_)$*y@AnT`r#wFGf-=`rF2fNpc}ou<+Z*&my+MCkWE0W@o~vV?aoQd+;tZ|d zbt%#`18-O|+iQs4w=W#@j0Z+tw<2Hv9g8)MdBPGKMq+#97{&q5_d(B9!za^`Ug`~a zE(P~Zdi&bK!42b)9}()Bjv2bC2ED`Cii#d5b`w91v@=w$k)!`Z8efmB>%{l=b$e+l zf$kxM#=6g;B|Iov-mYn*p=$~8f`Sn2BZ7BKdw!PGHNpeLhQkYro{A^y{gQmpGa2wq zjCmr&_4b`UPec1oQrBl42t`i*MRT3#8smY}C*qyNag9_3Mrs42wSg}pZzJXU2##Q( z*Q{I9LW+D;Goa+V_(DyY6LZjso%$^n^PxW%jm2syM&E$`#LZajFvaMH;H0wHz7u;M zK!mMIHPSCb8F~?;EF^iTt5E%zG0Z@hlbdVA!Q#+W%{RUzt(-?Cn}OPc>c+myJhUz6 zP&z2G-xf|B(!qpJmV6`F?Ag+k1xoF8u4#>mL*p|iKbWGD6L$!CMXQn%_YL_YaKT>5 z6_6d-=CDpBNZe242X#>DuuBa(*yhO6s5%u)a@&B@4Z$){LelQVYQSL7$g)P*gFpK@pA} zg&db9ba;6_=YDF!mC8kOvQqrO)nYlhr#(=mR^o- #include +#include #include #include #include @@ -34,15 +35,27 @@ void error(char *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_fd; int client_id; int port; int max_fd; -// char buf[BUFSIZE]; -// char tmp_buf[BUFSIZE]; -// int clients[FD_SETSIZE]; + int ret; + char buf[BUFSIZE]; + char tmp_buf[BUFSIZE]; + int clients[FD_SETSIZE]; struct sockaddr_in addr; socklen_t addr_len; fd_set fdset; @@ -53,16 +66,13 @@ int main(int ac, char **av) { 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); - // assign IP, PORT addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(2130706433); //127.0.0.1 addr.sin_port = htons(port); - // Binding newly created socket to given IP and verification if ((bind(server_fd, (const struct sockaddr *)&addr, addr_len)) == -1) error("Fatal error\n"); if (listen(server_fd, 10) == -1) @@ -79,69 +89,37 @@ int main(int ac, char **av) { select(max_fd + 1, &rdset, NULL, NULL, NULL); // new connection - + 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++; + } // new messages and close + 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); - -// len = sizeof(cli); -// connfd = accept(sockfd, (struct sockaddr *)&cli, &len); -// if (connfd < 0) { -// printf("server acccept failed...\n"); -// exit(0); -// } -// else -// printf("server acccept the client...\n"); } - -//int extract_message(char **buf, char **msg) -//{ -// char *newbuf; -// int i; -// -// *msg = 0; -// if (*buf == 0) -// return (0); -// i = 0; -// while ((*buf)[i]) -// { -// if ((*buf)[i] == '\n') -// { -// newbuf = calloc(1, sizeof(*newbuf) * (strlen(*buf + i + 1) + 1)); -// if (newbuf == 0) -// return (-1); -// strcpy(newbuf, *buf + i + 1); -// *msg = *buf; -// (*msg)[i + 1] = 0; -// *buf = newbuf; -// return (1); -// } -// i++; -// } -// return (0); -//} -// -//char *str_join(char *buf, char *add) -//{ -// char *newbuf; -// int len; -// -// if (buf == 0) -// len = 0; -// else -// len = strlen(buf); -// newbuf = malloc(sizeof(*newbuf) * (len + strlen(add) + 1)); -// if (newbuf == 0) -// return (0); -// newbuf[0] = 0; -// if (buf != 0) -// strcat(newbuf, buf); -// free(buf); -// strcat(newbuf, add); -// return (newbuf); -//} - -