diff --git a/.gitignore b/.gitignore index 51da08c..14df896 100755 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *client *server -*DS_Store \ No newline at end of file +*DS_Store +*.vscode \ No newline at end of file diff --git a/Makefile b/Makefile index 53433da..018c4a0 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,22 @@ -DESTDIR = ./ +CXX = g++ +CXX_FLAGS = -Wall -std=c++14 -lpthread -s +DESTDIR = ./bin/ +SRC_SERVER = ./src/server.cpp +SRC_CLIENT = ./src/client.cpp +INSTALL_DIR = /usr/local/bin/ build: - g++ -o $(DESTDIR)server server.cpp - g++ -o $(DESTDIR)client client.cpp -std=c++14 -lpthread + $(CXX) -o $(DESTDIR)server $(SRC_SERVER) $(CXX_FLAGS) + $(CXX) -o $(DESTDIR)client $(SRC_CLIENT) $(CXX_FLAGS) + upx $(DESTDIR)server + upx $(DESTDIR)client runserver: ./server 127.0.0.1 8000 runclient: - ./client 127.0.0.1 8000 \ No newline at end of file + ./client 127.0.0.1 8000 + +install: + cp -rf $(DESTDIR)server $(INSTALL_DIR)udpchatserver + cp -rf $(DESTDIR)client $(INSTALL_DIR)udpchatclient \ No newline at end of file diff --git a/bin/udpchatserver.log b/bin/udpchatserver.log new file mode 100644 index 0000000..8cb88b5 --- /dev/null +++ b/bin/udpchatserver.log @@ -0,0 +1,37 @@ +[ i ] tola [ 17:17:13 ] : asdf +[ i ] tola [ 17:17:13 ] : asd +[ i ] tola [ 17:17:13 ] : f +[ i ] tola [ 17:17:14 ] : asdf +[ i ] tola [ 17:17:14 ] : a +[ i ] tola [ 17:17:14 ] : sdf +[ i ] tola [ 17:17:14 ] : asd +[ i ] tola [ 17:17:14 ] : fa +[ i ] tola [ 17:17:14 ] : sdf +[ i ] tola [ 17:17:15 ] : asdf +[ i ] tola [ 17:17:15 ] : asd +[ i ] tola [ 17:17:15 ] : f +[ i ] tola [ 17:17:15 ] : asdf +[ i ] lisa [ 17:17:16 ] : dasfg +[ i ] lisa [ 17:17:17 ] : s +[ i ] lisa [ 17:17:17 ] : dfg +[ i ] lisa [ 17:17:17 ] : sdf +[ i ] lisa [ 17:17:17 ] : b +[ i ] lisa [ 17:17:17 ] : sdfvb +[ i ] lisa [ 17:17:17 ] : sdf +[ i ] lisa [ 17:17:18 ] : gv +[ i ] lisa [ 17:17:18 ] : sdfg +[ i ] lisa [ 17:17:18 ] : asdf +[ i ] lisa [ 17:17:18 ] : g +[ i ] lisa [ 17:17:18 ] : sdfg +[ i ] lisa [ 17:17:18 ] : sdf +[ i ] lisa [ 17:17:19 ] : gs +[ i ] lisa [ 17:17:19 ] : dfgb +[ i ] lisa [ 17:17:19 ] : sdfg +[ i ] lisa [ 17:17:19 ] : sdf +[ i ] lisa [ 17:17:19 ] : gs +[ i ] lisa [ 17:17:20 ] : dfg +[ i ] lisa [ 17:17:20 ] : sdfg +[ i ] lisa [ 17:17:20 ] : sdf +[ i ] lisa [ 17:17:20 ] : gdf +[ i ] lisa [ 17:17:20 ] : g +[ i ] lisa [ 17:17:20 ] : sdf diff --git a/client.cpp b/src/client.cpp similarity index 75% rename from client.cpp rename to src/client.cpp index 62bfc9e..529a582 100644 --- a/client.cpp +++ b/src/client.cpp @@ -8,14 +8,17 @@ #include #include #include - -using namespace std; +#include "colors.h" void send_message(int sockfd, struct sockaddr_in addr) { while (1) { char buffer[1024]; bzero(buffer, 1024); - cin.getline(buffer, 1024); + std::cin.getline(buffer, 1024); + if(!strcmp(buffer, "quit")) { + std::cout << GREEN << "you are exited.\n" << RESET; + exit(0); + } sendto(sockfd, buffer, 1024, 0, (struct sockaddr*)&addr, sizeof(addr)); } } @@ -51,19 +54,19 @@ int main(int argc, char** argv) { addr.sin_addr.s_addr = inet_addr(ip); char username[50]; - cout << "Enter tour username:" << endl; + std::cout << "Enter tour username:\n\t" << GREEN; bzero(username, 50); - cin.getline(username, 50); + std::cin.getline(username, 50); sendto(sockfd, username, 50, 0, (struct sockaddr*)&addr, sizeof(addr)); - cout << "Your username: " << username << endl; + std::cout << RESET << "Your username: " << GREEN << username << RESET << std::endl; - thread t1(send_message, sockfd, addr); + std::thread t1(send_message, sockfd, addr); while (1) { bzero(buffer, 1024); addr_size = sizeof(addr); recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*)&addr, &addr_size); - cout << buffer << endl; + std::cout << buffer << std::endl; } diff --git a/src/colors.h b/src/colors.h new file mode 100644 index 0000000..9f2c514 --- /dev/null +++ b/src/colors.h @@ -0,0 +1,9 @@ +#ifndef UDP_CHAT_COLORS_H +#define UDP_CHAT_COLORS_H + +#define GREEN "\033[0;32m" +#define BLUE "\033[0;34m" +#define RESET "\033[0m" +#define YELLOW "\033[1;33m" + +#endif // UDP_CHAT_COLORS_H \ No newline at end of file diff --git a/server.cpp b/src/server.cpp similarity index 65% rename from server.cpp rename to src/server.cpp index b00747b..716cc3b 100644 --- a/server.cpp +++ b/src/server.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -9,8 +10,9 @@ #include #include #include +#include "colors.h" -using namespace std; +#define LOGFILE "udpchatserver.log" //структура одного клиента на сервере struct client_t { @@ -36,7 +38,6 @@ int main(int argc, char** argv) { printf("Usage: %s ip port\n", argv[0]); exit(0); } - char* ip = argv[1]; int port = atoi(argv[2]); @@ -67,7 +68,7 @@ int main(int argc, char** argv) { unsigned int clientlength = sizeof(client_addr); for (int i = 0; i < num_of_clients; i++) { - cout << clients[i].addr.sin_port << clients[i].addr.sin_addr.s_addr << ";"; + std::cout << clients[i].addr.sin_port << clients[i].addr.sin_addr.s_addr << ";"; } @@ -92,7 +93,7 @@ int main(int argc, char** argv) { clientlength = sizeof(client_addr); int bytesin = recvfrom(sockfd, buffer, 1024, 0, (sockaddr *) &client_addr, &clientlength); if (bytesin < 0) { - cout << "error receving from client" << endl; + std::cout << "error receving from client\n"; continue; } if (!HaveClient(client_addr)) { @@ -107,22 +108,40 @@ int main(int argc, char** argv) { for (int i = 0; i < num_of_clients; i++) { if (clients[i].addr.sin_port != 0 && clients[i].addr.sin_addr.s_addr != 0) { if (!(clients[i].addr.sin_port == client_addr.sin_port && clients[i].addr.sin_addr.s_addr == client_addr.sin_addr.s_addr)) { - char res[1024]; - char time[128]; - std::time_t t = std::time(nullptr); - std::tm* now = std::localtime(&t); - strftime(time, sizeof(time), "%X", now); + if (strcmp(buffer, "")) { + std::ofstream logfile(LOGFILE, std::ios::app); + char res[1024]; + char logres[1024]; + char time[128]; + memset(&logres, '\0', 1024); + memset(&res, '\0', 1024); + memset(&time, '\0', 128); + std::time_t t = std::time(nullptr); + std::tm* now = std::localtime(&t); + strftime(time, sizeof(time), "%X", now); - for (int i = 0; i < num_of_clients; i++) { - if (clients[i].addr.sin_addr.s_addr == client_addr.sin_addr.s_addr && clients[i].addr.sin_port == client_addr.sin_port) { - strcpy(res, clients[i].username); + for (int i = 0; i < num_of_clients; i++) { + if (clients[i].addr.sin_addr.s_addr == client_addr.sin_addr.s_addr && clients[i].addr.sin_port == client_addr.sin_port) { + strcpy(res, GREEN); + strcat(res, clients[i].username); + strcat(logres, clients[i].username); + } } + strcat(res, BLUE " [ "); + strcat(res, time); + strcat(res, " ] " RESET ": " YELLOW); + strcat(res, buffer); + strcat(res, RESET); + sendto(sockfd, res, 1024, 0, (sockaddr *) &clients[i].addr, sizeof(clients[i].addr)); + printf("[ i ] %s\n", res); + strcat(logres, " [ "); + strcat(logres, time); + strcat(logres, " ] : "); + strcat(logres, buffer); + logfile << "[ i ] " << logres << "\n"; + logfile.close(); + // fprintf(logfile, "[ i ] %s\n", res); } - strcat(res, " ["); - strcat(res, time); - strcat(res, "] : "); - strcat(res, buffer); - sendto(sockfd, res, 1024, 0, (sockaddr *) &clients[i].addr, sizeof(clients[i].addr)); } } } @@ -131,4 +150,4 @@ int main(int argc, char** argv) { } return 0; -} \ No newline at end of file +}