From b649d379a9a3e7d4fd19b6af3baf7a80d9b1a79c Mon Sep 17 00:00:00 2001 From: asus Date: Mon, 13 Feb 2023 23:08:23 +0100 Subject: [PATCH] wip change architecture --- a.out | Bin 89360 -> 89528 bytes mini_serv.c | 36 +++----------- mini_serv_01.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+), 30 deletions(-) create mode 100644 mini_serv_01.c diff --git a/a.out b/a.out index 26843327a6b7e3f14193567c37d67b0160132f48..9bc6653499bd8d5440f53d9d2e702dab6a7a37ec 100755 GIT binary patch delta 19526 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 delta 19231 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 -//#include #include #include #include @@ -8,35 +6,12 @@ #include //sprintf -// accept -// atoi -// bind -// bzero -// calloc -// close -// exit -// free -// listen -// malloc -// memset -// realloc -// recv -// select -// send -// socket -// sprintf -// strcat -// strcpy -// strlen -// strstr -// write - #define BUFSIZE 42000 -typedef struct s_clients { +typedef struct s_client { int id; - char msg[BUFSIZE - 20]; -} t_clients; + char msg[1024]; +} t_client; void error(char *str) { write(2, str, strlen(str)); @@ -80,8 +55,8 @@ int main(int ac, char **av) { int port; int max_fd; int ret; - t_clients clients[FD_SETSIZE]; - t_clients client; + t_client clients[FD_SETSIZE]; + t_client client; char buf[BUFSIZE]; char msg[BUFSIZE]; @@ -103,6 +78,7 @@ int main(int ac, char **av) { FD_SET(server_fd, &fdset); max_fd = server_fd; client_id = 0; + bzero(&clients, sizeof(clients)); while (1) { rdset = fdset; diff --git a/mini_serv_01.c b/mini_serv_01.c new file mode 100644 index 0000000..90c5bbd --- /dev/null +++ b/mini_serv_01.c @@ -0,0 +1,125 @@ +#include +#include +#include +#include +#include +#include + +#define BUFSIZE 42000 + +typedef struct s_client { + int id; + char msg[1024]; +} t_client; + +// GLOBALS +int server_fd; +int id; +int max_fd; +socklen_t addr_len; +fd_set fdset; +t_client clients[FD_SETSIZE]; + +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); + } +} + +void handle_socket(struct sockaddr *addr) { + fd_set rdset; + int client_fd; + int ret; + t_client client; + char buf[BUFSIZE]; + char msg[BUFSIZE]; + + rdset = fdset; + select(max_fd + 1, &rdset, NULL, NULL, NULL); + + if (FD_ISSET(server_fd, &rdset)) { + client_fd = accept(server_fd, addr, &addr_len); + FD_SET(client_fd, &fdset); + if (client_fd > max_fd) + max_fd = client_fd; + client = clients[client_fd]; + client.id = id; + bzero(client.msg, strlen(client.msg)); + sprintf(buf, "server: client %d arrived\n", 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(msg, "server: client %d just left\n", clients[client_fd].id); + broadcast(msg, &fdset, max_fd, server_fd, client_fd); + FD_CLR(client_fd, &fdset); + } + else if (ret > 0) { + + client = clients[client_fd]; + for(int i = 0, j = strlen(client.msg); i < ret; ++i, ++j) { + client.msg[j] = buf[i]; + if (buf[i] == '\n') { + client.msg[j] = '\0'; + sprintf(msg, "client %d: %s\n", client.id, client.msg); + broadcast(msg, &fdset, max_fd, server_fd, client_fd); + bzero(client.msg, strlen(client.msg)); + j = -1; + } + } + + } + } + client_fd++; + } +} + +int main(int ac, char **av) { + struct sockaddr_in addr; + int port; + + if (ac != 2) + error("Fatal error\n"); + port = atoi(av[1]); + addr_len = sizeof(addr); + + // socket create and verification + if ( (server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -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) + error("Fatal error\n"); + + FD_ZERO(&fdset); + FD_SET(server_fd, &fdset); + max_fd = server_fd; + + while(1) + handle_socket((struct sockaddr *)&addr); + + return (0); +} +