CLIOBJECTS := $(CLISOURCES:.c=.o)
SERVSOURCES := server.c \
+ server_aux.c \
SERVSOURCES := $(addprefix $(SRCDIR)/, $(SERVSOURCES))
/* By: ljiriste <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */
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;
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;
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);
}
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]);
/* By: ljiriste <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <limits.h>
#include <unistd.h>
#include <signal.h>
-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;
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 ;
}
{
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);
}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* server.h :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: ljiriste <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* 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 <signal.h>
+
+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
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* server_aux.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: ljiriste <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* 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 <limits.h>
+#include <signal.h>
+
+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 ;
+}