From 1d690b43bd74cdaafaeb161a230d0438897b95f3 Mon Sep 17 00:00:00 2001 From: asus Date: Mon, 20 Feb 2023 16:19:41 +0100 Subject: [PATCH] training --- a.out | Bin 16896 -> 16896 bytes log.txt | 6041 +++++++++++++++++++++++++++++++++++++++++++++- log1.txt | 6009 ++++++++++++++++++++++++++++++++++++++++++++- log_eric.txt | 84 + log_luke.txt | 84 + mini_serv.c | 16 +- mini_serv_test.c | 126 + tester.sh | 49 +- tester_1.sh | 37 + 9 files changed, 12371 insertions(+), 75 deletions(-) create mode 100644 log_eric.txt create mode 100644 log_luke.txt create mode 100644 mini_serv_test.c create mode 100644 tester_1.sh diff --git a/a.out b/a.out index 1533482a23c291f8610cc363c12a63c4b636d929..a4266c02379fe41adf87a8bc8a6c475dc6531979 100755 GIT binary patch delta 1482 zcmah}U1$?o6rPFErnPlqZTe%iyZYqn!&aH zA&BiyQ~g%+UETqK9MmJbnv`{t&24jCm#QP}Ki*cpiegIYqWV*M*pB>Z_RL!tK3XYB zJoOGhcqTjOYJPmtdqhGd$pI!F6mDIT^8ak}14oY9v}QXI#V7Pz0*^skh*@ zkr>?iQM?!8ER<0#8Q}S+Mfu;Zd*Yq@H(NO`c)wPqTvLwkM zVy5cq>mCAn+COUK4P0Yh46G`HlG3>M_>GeYQvPD(P+dMub!H#cv zBb0aI8|lhYqs0eS$0R;f8qcr|9Qy_3d@j6%;v`yxgA|xd-bOOY3CCj|uC19bBxpy3 zdR}aeK?K!@&%->i5EA;Ay>o|>|Hu-I`MTFQp<`-jOj5Ke7$5KxRncxdTg!KFH{U^; z`9bOSa-sA&6c(_ot5hiw-WCPu_x02u@S2H0nYp>H)?aiAhmrHe=7GB91?>@`JyW7R zg4$Pw_W*&Ac>E_=S=t!@q64&>fXc+DKJ!Kgzk$<8D9~+WOfeQTYVyGVSd9drD@dA_Tf<+)v1=98p)Fdzo^U$0!ZHQvAIMYWtZ^_9Pucg}+- MT&?kjmS>gk0XQVhkN^Mx delta 1481 zcmZ`(U2GIp7`@Xjb_>N>O4n|ImevQX21#omA;Cf^z2@>$A;CV7_`d`tAqWqmQ8rtc zy};#m;9($zwa*FEm$_$$({3^ zd+zzpd^0@>qbFhXeOO-e&dYrKz}~R~>xTY$@9>-59n}2#x8%X{+w+Y($vq2RGFEg7 zI^ohRfuE$=HPkato-MAG$>+d2CyT&@^KEswKKpY!0B7#r6KN*tD2t9T85m}QWR?tgO$^$mcWGt`hANanE0roNQF1C)S4>Ell0`RXgE&GdI`9;n{ZL3o36;dHg{3C49~{8CJY+5D%j zDW3`6-q_|rSIglF+lbUFX5~Ys^&;Fe$&ny!BrrEHTq0q#z;=G9Ssm9}y_Zo_QV*V% zODB-Y?19x-v(I6vzXu?dxR1{(W4Q*vSZz(M7pX1c;ueuspJ0)C#VKH4FqyclB?J$l zkr_3q5plKOaE^wnYkvpvQc%n;B(>4$3%^o{9t8SxZiX8^Xu)1~Uke1lpfM_fEJ_tP zEx@S)>@v#@v`+RDAgQ8pybhs4Fw^jO_9{B`WD=Rh_fvxy3D{ z9OqEY+E7q8RH{iHY;z8UBk{8^MKXp;p%)(d{i%#WV6L~`!@0~_u`Dt90vMV{mRPh4 zsJvi*q+owohQQ{|N^NrzHcs1r(&k2;__PTzD$>rT+NRKSWH^3GEptAvZCRv2PPFgL zbWaix^zDq-J|Eu?#Nk_u3JvI$#W~BoV=r #define MSGSIZE 1024 -#define BUFSIZE MSGSIZE + 120000 +#define BUFSIZE 120000 typedef struct s_client { int id; @@ -20,10 +20,8 @@ void error(char *msg) { exit(1); } -void broadcast(char *msg, fd_set *set, int max_fd, int server_fd, int current_fd) { +void broadcast(char *msg, fd_set *set, int max_fd, int current_fd) { for(int i = 0; i <= max_fd; ++i) { - if (i == server_fd) - continue; if (i == current_fd) continue; if (FD_ISSET(i, set)) @@ -44,6 +42,7 @@ int main(int ac, char **av) { socklen_t addr_len; fd_set fdset; fd_set rdset; + fd_set wdset; t_client clients[FD_SETSIZE]; if (ac != 2) @@ -76,8 +75,9 @@ int main(int ac, char **av) { while(1) { rdset = fdset; + wdset = fdset; - select(max_fd + 1, &rdset, NULL, NULL, NULL); + select(max_fd + 1, &rdset, &wdset, NULL, NULL); if (FD_ISSET(server_fd, &rdset)) { client_fd = accept(server_fd, (struct sockaddr *)&addr, &addr_len); @@ -87,7 +87,7 @@ int main(int ac, char **av) { clients[client_fd].id = id; bzero(clients[client_fd].msg, MSGSIZE); sprintf(msg, "server: client %d just arrived\n", id); - broadcast(msg, &fdset, max_fd, server_fd, client_fd); + broadcast(msg, &wdset, max_fd, client_fd); id++; } @@ -97,7 +97,7 @@ int main(int ac, char **av) { ret = recv(client_fd, buf, BUFSIZE, 0); if (ret == 0) { sprintf(msg, "server: client %d just left\n", clients[client_fd].id); - broadcast(msg, &fdset, max_fd, server_fd, client_fd); + broadcast(msg, &wdset, max_fd, client_fd); FD_CLR(client_fd, &fdset); close(client_fd); if (client_fd == max_fd) { @@ -113,7 +113,7 @@ int main(int ac, char **av) { if (buf[i] == '\n') { clients[client_fd].msg[j] = '\0'; sprintf(msg, "client %d: %s\n", clients[client_fd].id, clients[client_fd].msg); - broadcast(msg, &fdset, max_fd, server_fd, client_fd); + broadcast(msg, &wdset, max_fd, client_fd); bzero(clients[client_fd].msg, MSGSIZE); j = -1; } diff --git a/mini_serv_test.c b/mini_serv_test.c new file mode 100644 index 0000000..aa6d409 --- /dev/null +++ b/mini_serv_test.c @@ -0,0 +1,126 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define MSGSIZE 1024 +#define BUFSIZE 120000 + +typedef struct s_client { + int id; + char msg[MSGSIZE]; +} t_client; + +void error(char *msg) { + write(2, msg, strlen(msg)); + exit (1); +} + +void broadcast(char *msg, fd_set *set, int max_fd, int client_fd) { + for(int fd = 0; fd < max_fd; ++fd) { + if (fd == client_fd) + continue; + if (FD_ISSET(fd, set)) + send(fd, msg, strlen(msg), 0); + } +} + +int main(int ac, char **av) { + int server_fd; + int client_fd; + int id; + int ret; + int port; + int max_fd; + struct sockaddr_in addr; + socklen_t addr_len; + fd_set fdset; + fd_set rdset; + fd_set wdset; + char buf[BUFSIZE]; + char msg[BUFSIZE]; + t_client clients[FD_SETSIZE]; + + if (ac != 2) + error("Wrong number of arguments\n"); + if ( (port = atoi(av[1])) == -1) + error("Fatal error\n"); + addr_len = sizeof(addr); + bzero(&addr, addr_len); + + // socket create and verification + server_fd = socket(AF_INET, SOCK_STREAM, 0); + if (server_fd == -1) + error("Fatal error\n"); + + // 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) + error("Fatal error\n"); + + FD_ZERO(&fdset); + FD_SET(server_fd, &fdset); + id = 0; + max_fd = server_fd; + + while(1) { + rdset = fdset; + wdset = fdset; + + select(max_fd + 1, &rdset, &wdset, NULL, NULL); + + if (FD_ISSET(server_fd, &rdset)) { + client_fd = accept(server_fd, (struct sockaddr *)&addr, &addr_len); + FD_SET(client_fd, &fdset); + if (client_fd > max_fd) + max_fd = client_fd; + clients[client_fd].id = id; + bzero(clients[client_fd].msg, MSGSIZE); + sprintf(msg, "server: client %d just arrived\n", id); + broadcast(msg, &wdset, max_fd, client_fd); + id++; + } + + client_fd = 0; + while(client_fd <= max_fd) { + ret = 1; + if (FD_ISSET(client_fd, &rdset)) { + bzero(buf, BUFSIZE); + ret = recv(client_fd, buf, BUFSIZE, 0); + if (ret == 0) { + sprintf(msg, "server: client %d just left\n", clients[client_fd].id); + broadcast(msg, &wdset, max_fd, client_fd); + FD_CLR(client_fd, &fdset); + close(client_fd); + } + else if (ret > 0) { + for(int i = 0, j = strlen(clients[client_fd].msg); i < ret; ++i, ++j) { + clients[client_fd].msg[j] = buf[i]; + if (buf[i] == '\n') { + clients[client_fd].msg[j] = '\0'; + sprintf(msg, "client %d: %s\n", clients[client_fd].id, clients[client_fd].msg); + broadcast(msg, &wdset, max_fd, client_fd); + bzero(clients[client_fd].msg, MSGSIZE); + j = -1; + } + } + } + } + client_fd++; + } + + + } + return (0); +} + diff --git a/tester.sh b/tester.sh index f1555f5..a1d3e60 100644 --- a/tester.sh +++ b/tester.sh @@ -1,9 +1,24 @@ #!/bin/bash +path="mini_serv.c" +nine=0 + +for var in "$@" +do + if [ "$var" = "nine" ] + then + nine=1 + else + path="$var" + fi +done + port=0 -while [ $port -lt 1024 -o $port -gt 10000 ]; do +while [ $port -lt 1024 -o $port -gt 10000 ] +do port=$RANDOM done + id=1 test_number=0 @@ -13,7 +28,8 @@ launch_client() { while read -r line do - echo "$test_number - receiver $id $(date +%s%N): $line" + #echo "$test_number - receiver $id $(date +%s%N): $line" + echo "$test_number - receiver $id : $line" done < <(echo "$1" | nc localhost "$port" 2>&1) & sleep 0.1 @@ -32,10 +48,26 @@ new_test() { launch_client "" } -clang -Wall -Wextra -Werror mini_serv.c 2>&1 +clang -Wall -Wextra -Werror $path 2>&1 ./a.out "$port" 2>&1 & +## # # # # # # # # # # # # # # # # # # # # # # # # # +# # +if [ "$nine" -eq 1 ] +then + nc localhost "$port" 2>&1 & + for i in {1..3000} + do + #launch_client + nc localhost "$port" 2>&1 & + stop_last_client + done + + killall -q a.out nc + exit 1 +fi + # # # # # # # # # # # # # # # # # # # # # # # # # # # new_test "open a client an close, 3 times" @@ -96,17 +128,6 @@ launch_client "$text" stop_last_client -## # # # # # # # # # # # # # # # # # # # # # # # # # -# # -for i in {1..3000} -do - #launch_client - nc localhost "$port" 2>&1 & - stop_last_client -done - -echo "" -echo "done" killall -q a.out nc diff --git a/tester_1.sh b/tester_1.sh new file mode 100644 index 0000000..40bb9e9 --- /dev/null +++ b/tester_1.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +port=0 +while [ "$port" -lt 1024 -o "$port" -gt 10000 ] +do + port=$RANDOM +done +id=0 + +launch() { + while read -r line + do + echo "receiver $id: $line" + done < <(nc 127.0.0.1 "$port" 2>&1) & + ((++id)) +} + +clang -Wall -Wextra -Werror mini_serv.c +./a.out "$port" 2>&1 & +launch + +#launch +#launch +#launch +#kill -KILL $(pidof nc | tr ' ' '\n' | head -n1 ) +#launch +#kill -KILL $(pidof nc | tr ' ' '\n' | head -n1 ) +#launch +#kill -KILL $(pidof nc | tr ' ' '\n' | head -n1 ) + +for i in {1..30} +do + launch + kill -KILL $(pidof nc | tr ' ' '\n' | head -n1 ) +done + +killall -q a.out nc