From df50428f4c892b8e146ddcf119522d0ffca9f475 Mon Sep 17 00:00:00 2001 From: TolaMironcenko Date: Fri, 13 Feb 2026 20:18:13 +0700 Subject: [PATCH] added log.h and some update --- src/client.c | 21 ++++++++++++++------- src/colors.h | 21 +++++++++------------ src/log.h | 42 ++++++++++++++++++++++++++++++++++++++++++ src/main.c | 29 ++++++++++++++++------------- 4 files changed, 81 insertions(+), 32 deletions(-) create mode 100644 src/log.h diff --git a/src/client.c b/src/client.c index cf296a8..d2aef56 100644 --- a/src/client.c +++ b/src/client.c @@ -1,11 +1,12 @@ #include #include -#include #include #include +#include #include +#include "log.h" -#define PORT 5555 +#define PORT 7777 #define BUFFER_SIZE 1024 int main() { @@ -29,8 +30,8 @@ int main() { return 1; } - if (fork() == 0) { - // Процесс чтения + pid_t child_pid = fork(); + if (child_pid == 0) { while (1) { int valread = read(sock, buffer, BUFFER_SIZE); if (valread > 0) { @@ -40,13 +41,19 @@ int main() { } } else { char username[50]; + printf("Enter your username: "); fgets(username, 50, stdin); - username[strlen(username)-1] = '\0'; + username[strlen(username) - 1] = '\0'; send(sock, username, 50, 0); - printf("username = %s\n", username); - // Процесс отправки + log_info("username = %s\n", username); while (1) { fgets(buffer, BUFFER_SIZE, stdin); + if (strcmp(buffer, "/exit\n") == 0) { + log_info("Client is exiting\n"); + kill(child_pid, SIGKILL); + close(sock); + break; + } send(sock, buffer, strlen(buffer), 0); } } diff --git a/src/colors.h b/src/colors.h index 43cd64a..882daff 100644 --- a/src/colors.h +++ b/src/colors.h @@ -1,14 +1,13 @@ -#ifndef COLORS_H -#define COLORS_H +#pragma once #define RESET "\033[0m" -#define GREEN "\033[0;32m" // GREEN -#define BLUE "\033[0;34m" // BLUE -#define YELLOW "\033[1;33m" // YELLOW -#define RED "\033[0;31m" // RED -#define BLACK "\033[0;30m" // BLACK -#define PURPLE "\033[0;35m" // PURPLE -#define CYAN "\033[0;36m" // CYAN -#define WHITE "\033[0;37m" // WHITE +#define GREEN "\033[0;32m" // GREEN +#define BLUE "\033[0;34m" // BLUE +#define YELLOW "\033[1;33m" // YELLOW +#define RED "\033[0;31m" // RED +#define BLACK "\033[0;30m" // BLACK +#define PURPLE "\033[0;35m" // PURPLE +#define CYAN "\033[0;36m" // CYAN +#define WHITE "\033[0;37m" // WHITE #define BBLACK "\033[1;30m" // BLACK #define BRED "\033[1;31m" // RED #define BGREEN "\033[1;32m" // GREEN @@ -57,5 +56,3 @@ #define ON_IPURPLE "\033[0;105m" // PURPLE #define ON_ICYAN "\033[0;106m" // CYAN #define ON_IWHITE "\033[0;107m" // WHITE - -#endif diff --git a/src/log.h b/src/log.h new file mode 100644 index 0000000..56c493d --- /dev/null +++ b/src/log.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include +#include +#include "colors.h" + +void log_info(const char *restrict __format, ...) { + time_t now = time(NULL); + struct tm *local = localtime(&now); + char timebuffer[80]; + strftime(timebuffer, sizeof(timebuffer), "%d.%m.%Y %H:%M:%S", local); + printf("%s[%s]%s [%s] ", GREEN, "INFO", RESET, timebuffer); + va_list args; + va_start(args, __format); + vprintf(__format, args); + va_end(args); +} + +void log_warn(const char *restrict __format, ...) { + time_t now = time(NULL); + struct tm *local = localtime(&now); + char timebuffer[80]; + strftime(timebuffer, sizeof(timebuffer), "%d.%m.%Y %H:%M:%S", local); + printf("%s[%s]%s [%s] ", YELLOW, "WARN", RESET, timebuffer); + va_list args; + va_start(args, __format); + vprintf(__format, args); + va_end(args); +} + +void log_error(const char *restrict __format, ...) { + time_t now = time(NULL); + struct tm *local = localtime(&now); + char timebuffer[80]; + strftime(timebuffer, sizeof(timebuffer), "%d.%m.%Y %H:%M:%S", local); + printf("%s[%s]%s [%s] ", RED, "ERROR", RESET, timebuffer); + va_list args; + va_start(args, __format); + vprintf(__format, args); + va_end(args); +} diff --git a/src/main.c b/src/main.c index 3c8dfac..20d26b5 100644 --- a/src/main.c +++ b/src/main.c @@ -1,13 +1,16 @@ #include #include +#include +#include #include #include #include #include #include #include +#include "log.h" -#define PORT 5555 +#define PORT 7777 #define MAX_CLIENTS 10 #define BUFFER_SIZE 1024 @@ -31,13 +34,13 @@ int main() { server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd < 0) { - perror("socket"); + log_error("socket"); exit(EXIT_FAILURE); } int opt = 1; if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) { - perror("setsockopt"); + log_error("setsockopt"); exit(EXIT_FAILURE); } @@ -46,12 +49,12 @@ int main() { address.sin_port = htons(PORT); if (bind(server_fd, (struct sockaddr *) &address, sizeof(address)) < 0) { - perror("bind"); + log_error("bind"); exit(EXIT_FAILURE); } if (listen(server_fd, 5) < 0) { - perror("listen"); + log_error("listen"); exit(EXIT_FAILURE); } @@ -69,7 +72,7 @@ int main() { } if (select(max_sd + 1, &readfds, NULL, NULL, NULL) < 0) { - perror("select"); + log_error("select"); exit(EXIT_FAILURE); } @@ -78,7 +81,7 @@ int main() { int new_socket = accept(server_fd, (struct sockaddr *) &address, (socklen_t *) &addrlen); - printf("New connection: socket %d\n", new_socket); + log_info("New connection: socket %d\n", new_socket); read(new_socket, buffer, BUFFER_SIZE); for (int i = 0; i < MAX_CLIENTS; i++) { @@ -101,20 +104,20 @@ int main() { int valread = read(sd, buffer, BUFFER_SIZE); if (valread == 0) { - printf("Client disconnected: socket %d\n", sd); + log_info("Client disconnected: socket %d\n", sd); close(sd); clients[i].sock = 0; bzero(clients[i].username, sizeof(clients[i].username)); } else { buffer[valread] = '\0'; - printf("from_socket: %d\n", sd); - printf("from_username: %s\n", sd_username); - printf("Message: %s\n", buffer); - + log_info("[%s]: %s", sd_username, buffer); + char *message = malloc(strlen(buffer) + strlen(sd_username) + 5); + sprintf(message, "[%s]: %s", sd_username, buffer); // Рассылка всем другим for (int j = 0; j < MAX_CLIENTS; j++) { if (clients[j].sock != 0 && clients[j].sock != sd) { - send(clients[j].sock, buffer, strlen(buffer), 0); + send(clients[j].sock, message, strlen(message), 0); + free(message); } } }