From 34d875c8025c5cdb140edd9652a94e9334e42353 Mon Sep 17 00:00:00 2001 From: adjoly Date: Thu, 18 Sep 2025 22:26:03 +0200 Subject: [PATCH] =?UTF-8?q?=E3=80=8C=E2=9C=A8=E3=80=8D=20feat:=20working?= =?UTF-8?q?=20bitch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + a.out | Bin 20128 -> 0 bytes mini_serv.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 88 insertions(+), 8 deletions(-) delete mode 100755 a.out diff --git a/.gitignore b/.gitignore index 92b2793..19e5fb8 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .direnv +a.out diff --git a/a.out b/a.out deleted file mode 100755 index ad79be9c38732c65f18f1685d84544798b220111..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20128 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 HM6&+@Q;Ewz diff --git a/mini_serv.c b/mini_serv.c index b91d3c6..59fd124 100644 --- a/mini_serv.c +++ b/mini_serv.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -22,23 +23,102 @@ int sockfd; fd_set main_fd, read_fd; +void send_all(); + +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); +} + void append_client(int cli_fd) { lastid++; clients[cli_fd].id = lastid; clients[cli_fd].msg = NULL; FD_SET(cli_fd, &main_fd); + bzero(send_buf, 3000); + sprintf(send_buf, "server: client %d just arrived\n", lastid); + send_all(cli_fd); } -void send_all() { +void rm_client(int cli_fd) { + FD_CLR(cli_fd, &read_fd); + sprintf(send_buf, "server: client %d, just left\n", clients[cli_fd].id); + send_all(cli_fd); + clients[cli_fd].id = -1; + if (clients[cli_fd].msg != NULL) { + free(clients[cli_fd].msg); + clients[cli_fd].msg = NULL; + } + FD_CLR(cli_fd, &main_fd); + close(cli_fd); +} + +int read_client(int fd) { + char tmp[3000]; + int bytes; + if ((bytes = recv(fd, tmp, 3000, 0)) <= 0) + return (rm_client(fd), 0); + tmp[bytes] = 0; + clients[fd].msg = str_join(clients[fd].msg, tmp); + char *line = 0; + while (extract_message(&clients[fd].msg, &line)) { + bzero(send_buf, 3000); + sprintf(send_buf, "client %d: %s", clients[fd].id, line); + send_all(fd); + free(line); + } + return 1; +} + +void send_all(int cli_fd) { size_t len = strlen(send_buf); + printf("%s", send_buf); for (int i = 0; i <= maxfd; i++) - if (FD_ISSET(i, &read_fd)) + if (FD_ISSET(i, &main_fd) != 0 && i != cli_fd && i != sockfd) send(i, send_buf, len, 0); } int send_error(void) { - for (int i = 0; i < FD_SETSIZE; i++) + for (int i = 0; i < maxfd; i++) if (FD_ISSET(i, &main_fd)) close(i); close(sockfd); @@ -66,7 +146,7 @@ int main(int ac, char **av) { if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) return (send_error()); - if (listen(sockfd, 10) != 0) + if (listen(sockfd, SOMAXCONN) != 0) return (send_error()); FD_ZERO(&main_fd); @@ -91,11 +171,10 @@ int main(int ac, char **av) { if (cli_fd > maxfd) maxfd = cli_fd; append_client(cli_fd); - bzero(send_buf, 3000); - sprintf(send_buf, "server: client %d just arrived\n", - lastid); - send_all(); + break; } else { + if (!read_client(i)) + break; } } }