From 5019dc9fe79bd403e524340d9dfbc655c5ecaffe Mon Sep 17 00:00:00 2001 From: Lukas Jiriste Date: Tue, 23 Jan 2024 13:28:30 +0100 Subject: [PATCH] Refactor server (and client), fix typo --- Makefile | 1 + src/client.c | 31 +++++++--------- src/server.c | 93 +++++++++++++++--------------------------------- src/server.h | 29 +++++++++++++++ src/server_aux.c | 55 ++++++++++++++++++++++++++++ 5 files changed, 126 insertions(+), 83 deletions(-) create mode 100644 src/server.h create mode 100644 src/server_aux.c diff --git a/Makefile b/Makefile index e71a430..22c77b6 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ CLISOURCES := $(addprefix $(SRCDIR)/, $(CLISOURCES)) CLIOBJECTS := $(CLISOURCES:.c=.o) SERVSOURCES := server.c \ + server_aux.c \ SERVSOURCES := $(addprefix $(SRCDIR)/, $(SERVSOURCES)) diff --git a/src/client.c b/src/client.c index e6c4f37..b03a3b7 100644 --- a/src/client.c +++ b/src/client.c @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/20 17:15:06 by ljiriste #+# #+# */ -/* Updated: 2024/01/23 12:29:57 by ljiriste ### ########.fr */ +/* Updated: 2024/01/23 13:27:45 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,19 +24,6 @@ void handler(int signum) return ; } -void send_bit(pid_t server_pid, int bit) -{ - if (bit) - { - kill(server_pid, SIGUSR1); - } - else - { - kill(server_pid, SIGUSR2); - } - return ; -} - void send_message(pid_t server_pid, const char *message) { int char_bits_sent; @@ -49,11 +36,14 @@ void send_message(pid_t server_pid, const char *message) while (char_ind <= message_length) { if (!g_may_send) - pause(); + pause(); else { g_may_send = 0; - send_bit(server_pid, message[char_ind] & 1 << char_bits_sent); + if (message[char_ind] & 1 << char_bits_sent) + kill(server_pid, SIGUSR1); + else + kill(server_pid, SIGUSR2); ++char_bits_sent; if (char_bits_sent == CHAR_BIT) ++char_ind; @@ -72,7 +62,10 @@ void send_pid(pid_t server_pid) my_pid = getpid(); while (bits_sent < sizeof(pid_t) * CHAR_BIT) { - send_bit(server_pid, my_pid & 1 << bits_sent); + if (my_pid & 1 << bits_sent) + kill(server_pid, SIGUSR1); + else + kill(server_pid, SIGUSR2); ++bits_sent; usleep(100); } @@ -100,8 +93,8 @@ int main(int argc, char **argv) setup_handler(); if (argc != 3) { - ft_printf("Invalid number of args. Th call should look like:\n" - "client SERVER_PID MESSAGE\n"); + ft_printf("Invalid number of args. The call should look like this:\n" + "client SERVER_PID MESSAGE\n"); return (0); } server_pid = ft_atoi(argv[1]); diff --git a/src/server.c b/src/server.c index 1661533..898d46a 100644 --- a/src/server.c +++ b/src/server.c @@ -6,34 +6,29 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/20 15:12:04 by ljiriste #+# #+# */ -/* Updated: 2024/01/23 12:36:00 by ljiriste ### ########.fr */ +/* Updated: 2024/01/23 13:26:46 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ +#include "server.h" #include "libft.h" #include #include #include -typedef struct s_transfer -{ - int bit; - int transfer_done; -} t_transfer; - -t_transfer g_transfer; +static t_transfer g_trans; -void bit_reciever(int signum) +static void bit_reciever(int signum) { if (signum == SIGUSR1) - g_transfer.bit = 1; + g_trans.bit = 1; else - g_transfer.bit = 0; - g_transfer.transfer_done = 1; + g_trans.bit = 0; + g_trans.transfer_done = 1; return ; } -void setup_handler(void) +static void setup_handler(void) { struct sigaction sa; @@ -47,22 +42,21 @@ void setup_handler(void) return ; } -void init_transfer(t_transfer *t) -{ - t->transfer_done = 0; - return ; -} - -void general_setup(t_transfer *t) +static void general_setup(t_vec *string, pid_t *c_pid, + int *c_pid_known, char *ch) { - init_transfer(t); setup_handler(); ft_printf("Hello, I'm a minitalk server.\n" - "You can contact me through my PID: %i.\n" - "For legibility I'll leave one empty line " - "after this initial message.\n" - "I'll also append newline to every message recieved.\n" - "I'm starting to print the messages now:\n\n", getpid()); + "You can contact me through my PID: %i.\n" + "For legibility I'll leave one empty line " + "after this initial message.\n" + "I'll also append empty line to every message recieved.\n" + "I'm starting to print the messages now:\n\n", getpid()); + *c_pid = 0; + *c_pid_known = 0; + *ch = 0; + g_trans.transfer_done = 0; + ft_vec_init(string, sizeof(char)); return ; } @@ -70,54 +64,25 @@ int main(void) { pid_t c_pid; int c_pid_known; - int bits_recieved; char ch; t_vec string; - bits_recieved = 0; - c_pid = 0; - c_pid_known = 0; - ch = 0; - general_setup(&g_transfer); - ft_vec_init(&string, sizeof(char)); + general_setup(&string, &c_pid, &c_pid_known, &ch); while (1) { if (c_pid_known) kill(c_pid, SIGUSR1); - if (!g_transfer.transfer_done) + if (!g_trans.transfer_done) pause(); - if (g_transfer.transfer_done && !c_pid_known) - { - c_pid |= g_transfer.bit << bits_recieved; - g_transfer.transfer_done = 0; - ++bits_recieved; - if (bits_recieved == sizeof(pid_t) * CHAR_BIT) - { - bits_recieved = 0; - c_pid_known = 1; - } - } - else if (g_transfer.transfer_done) + if (g_trans.transfer_done && !c_pid_known) + c_pid_known = pid_constructor(&c_pid, &g_trans); + else if (g_trans.transfer_done && char_constructor(&ch, &g_trans)) { - ch |= g_transfer.bit << bits_recieved; - g_transfer.transfer_done = 0; - ++bits_recieved; - if (bits_recieved == CHAR_BIT && ch != 0) - { - ft_vec_append(&string, &ch); - } - else if (bits_recieved == CHAR_BIT && ch == 0) - { - ft_printf("From process %i: %s\n", c_pid, string.vec); - ft_vec_forget_range(&string, string.size, 0); - c_pid_known = 0; - c_pid = 0; - } - bits_recieved %= CHAR_BIT; - if (bits_recieved == 0) - ch = 0; + ft_vec_append(&string, &ch); + if (ch == 0) + end_connection(&string, &c_pid, &c_pid_known); + ch = 0; } } - ft_vec_free(&string, NULL); return (0); } diff --git a/src/server.h b/src/server.h new file mode 100644 index 0000000..f4b6b04 --- /dev/null +++ b/src/server.h @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* server.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ljiriste +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/01/23 13:12:14 by ljiriste #+# #+# */ +/* Updated: 2024/01/23 13:26:14 by ljiriste ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef SERVER_H +# define SERVER_H + +# include "libft.h" +# include + +typedef struct s_transfer +{ + int bit; + int transfer_done; +} t_transfer; + +int pid_constructor(pid_t *c_pid, t_transfer *t); +int char_constructor(char *c, t_transfer *t); +void end_connection(t_vec *string, pid_t *c_pid, int *c_pid_known); + +#endif //SERVER_H diff --git a/src/server_aux.c b/src/server_aux.c new file mode 100644 index 0000000..22ae20b --- /dev/null +++ b/src/server_aux.c @@ -0,0 +1,55 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* server_aux.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ljiriste +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/01/23 13:10:43 by ljiriste #+# #+# */ +/* Updated: 2024/01/23 13:25:43 by ljiriste ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "server.h" +#include "libft.h" +#include +#include + +int pid_constructor(pid_t *c_pid, t_transfer *t) +{ + static int bits_recieved = 0; + + *c_pid |= t->bit << bits_recieved; + t->transfer_done = 0; + ++bits_recieved; + if (bits_recieved == sizeof(pid_t) * CHAR_BIT) + { + bits_recieved = 0; + return (1); + } + return (0); +} + +int char_constructor(char *c, t_transfer *t) +{ + static int bits_recieved = 0; + + *c |= t->bit << bits_recieved; + t->transfer_done = 0; + ++bits_recieved; + if (bits_recieved == CHAR_BIT) + { + bits_recieved = 0; + return (1); + } + return (0); +} + +void end_connection(t_vec *string, pid_t *c_pid, int *c_pid_known) +{ + ft_printf("%s\n\n", string->vec); + ft_vec_forget_range(string, string->size, 0); + *c_pid_known = 0; + *c_pid = 0; + return ; +} -- 2.30.2