From e0646139e3e3f1a9dfc1f9896b46e1a85b90c526 Mon Sep 17 00:00:00 2001 From: Timerix Date: Wed, 23 Jul 2025 00:26:02 +0300 Subject: [PATCH] implemented exit from client --- src/main.c | 62 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/src/main.c b/src/main.c index 1c52b9b..918e4ae 100755 --- a/src/main.c +++ b/src/main.c @@ -43,7 +43,7 @@ Result(void) test_aes(){ static pthread_mutex_t stdout_mutex = {0}; -// thread-safe print +/// thread-safe print #define printf_safe(ARGS...) {\ pthread_mutex_lock(&stdout_mutex);\ printf(ARGS);\ @@ -51,6 +51,28 @@ static pthread_mutex_t stdout_mutex = {0}; pthread_mutex_unlock(&stdout_mutex);\ } +/// removes blank characters from line end +void line_trim(str* line, bool set_zero_at_end){ + bool stop = false; + while(line->size > 0 && !stop) + { + char last_char = line->data[line->size - 1]; + switch(last_char){ + case '\0': case '\r': case '\n': + case '\t': case ' ': + line->size--; + break; + default: + stop = true; + break; + } + } + if(set_zero_at_end){ + line->data[line->size] = '\0'; + line->isZeroTerminated = true; + } +} + void* test_server(void* data){ printf_safe("[server]: opening main socket\n"); try_fatal(main_socket, socket_open_TCP(), ); @@ -66,29 +88,17 @@ void* test_server(void* data){ while(true){ try_fatal(read_n, socket_recv(client_conn.i, buf), - socket_close(client_conn.i)); + { + socket_close(client_conn.i); + socket_close(main_socket.i); + }); if(read_n.i == 0){ sleepMsec(20); continue; } - char* data_s = (char*)buf.data; - char last_char; - bool stop = false; - while(read_n.i > 0 && !stop) - { - last_char = data_s[read_n.i - 1]; - switch(last_char){ - case '\0': case '\r': case '\n': - case '\t': case ' ': - read_n.i--; - break; - default: - stop = true; - break; - } - } - data_s[read_n.i] = '\0'; - printf_safe("[server]: got '%s'\n", data_s); + str message = str_construct(buf.data, read_n.u, false); + line_trim(&message, true); + printf_safe("[server]: received '%s'\n", message.data); } socket_close(client_conn.i); printf_safe("[server]: client socket closed\n"); @@ -106,15 +116,19 @@ void* test_client(void* data){ socket_connect(client_socket.i, server_end), socket_close(client_socket.i)); Array buf = Array_alloc(u8, 1024); - i32 read_n; printf_safe("[client]: reading stdin\n"); while(fgets(buf.data, buf.size, stdin) != NULL){ - read_n = strlen(buf.data) + 1; + str line = str_construct(buf.data, strlen(buf.data), true); + line_trim(&line, true); + if(str_equals(line, STR("/q"))){ + printf_safe("[client]: quit\n"); + break; + } try_fatal(_50, - socket_send(client_socket.i, Array_construct_size(buf.data, read_n)), + socket_send(client_socket.i, str_castTo_Array(line)), socket_close(client_socket.i)); } - printf_safe("[client]: stdin end\n"); + printf_safe("[client]: closing connection\n"); socket_close(client_socket.i); return NULL; }