From 1184b844d87c302d9fc3de5d1ad2e5590ff572c7 Mon Sep 17 00:00:00 2001 From: asus Date: Sat, 11 Feb 2023 22:54:36 +0100 Subject: [PATCH] wip solution for split messages --- mini_serv.c | 34 ++++++++++---- mini_serv_2.c | 125 -------------------------------------------------- mini_serv_3.c | 102 ---------------------------------------- 3 files changed, 24 insertions(+), 237 deletions(-) delete mode 100644 mini_serv_2.c delete mode 100644 mini_serv_3.c diff --git a/mini_serv.c b/mini_serv.c index 8f34032..7c5b10b 100644 --- a/mini_serv.c +++ b/mini_serv.c @@ -68,19 +68,23 @@ void broadcast(char *buf, fd_set *set, int max_fd, int server_fd, int sender_fd) } int main(int ac, char **av) { - int port; int server_fd; int client_fd; - int max_fd; int client_id; + + int port; + int max_fd; + int ret; + int clients[FD_SETSIZE]; + char buf[BUFSIZE]; char tmpbuf[BUFSIZE]; + char msg[BUFSIZE]; + struct sockaddr_in addr; socklen_t addr_len; fd_set fdset; fd_set rdset; - int clients[FD_SETSIZE]; - int ret; if (ac != 2) error("Wrong number of arguments\n"); @@ -109,8 +113,8 @@ int main(int ac, char **av) { 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); + sprintf(msg, "server: client %d just arrived\n", client_id); + broadcast(msg, &fdset, max_fd, server_fd, client_fd); client_id++; } @@ -122,13 +126,23 @@ int main(int ac, char **av) { 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); + sprintf(msg, "server: client %d just left\n", clients[client_fd]); + broadcast(msg, &fdset, max_fd, server_fd, client_fd); FD_CLR(client_fd, &fdset); } else if (ret > 0) { - sprintf(tmpbuf, "client %d: %s", clients[client_fd], buf); - broadcast(tmpbuf, &fdset, max_fd, server_fd, client_fd); + + for(int i = 0, j = 0; buf[i] != '\n'; ++i, ++j) { + tmpbuf[j] = buf[i]; + if (buf[i] == '\n') { + tmpbuf[j] = '\0'; + sprintf(msg, "client %d: %s\n", clients[client_fd], tmpbuf); + broadcast(msg, &fdset, max_fd, server_fd, client_fd); + bzero(tmpbuf, strlen(tmpbuf)); + j = -1; + } + } + } } client_fd++; diff --git a/mini_serv_2.c b/mini_serv_2.c deleted file mode 100644 index fff7b82..0000000 --- a/mini_serv_2.c +++ /dev/null @@ -1,125 +0,0 @@ -#include -#include -#include -#include -#include -#include - -// write -// close -// select -// socket -// accept -// listen -// send -// recv -// bind -// strstr -// malloc -// realloc -// free -// calloc -// bzero -// atoi -// sprintf -// strlen -// exit -// strcpy -// strcat -// memset - -#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; - char buf[BUFSIZE]; - char tmp_buf[BUFSIZE]; - int clients[FD_SETSIZE]; - struct sockaddr_in addr; - socklen_t addr_len; - fd_set fdset; - fd_set rdset; - - if (ac != 2) - error("Wrong number of arguments\n"); - port = atoi(av[1]); - addr_len = sizeof(addr); - - 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); - - // 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); -} - diff --git a/mini_serv_3.c b/mini_serv_3.c deleted file mode 100644 index bbf2692..0000000 --- a/mini_serv_3.c +++ /dev/null @@ -1,102 +0,0 @@ -#include -#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); -} -