refactor and add feature
This commit is contained in:
1 parent
2b931dee86
commit
81625e9f13
6 files changed
+111
-31
No files matched your search
+2
-1
@@ -1,3 +1,4 @@
|
||||
*client
|
||||
*server
|
||||
*DS_Store
|
||||
*DS_Store
|
||||
*.vscode
|
||||
@@ -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
|
||||
./client 127.0.0.1 8000
|
||||
|
||||
install:
|
||||
cp -rf $(DESTDIR)server $(INSTALL_DIR)udpchatserver
|
||||
cp -rf $(DESTDIR)client $(INSTALL_DIR)udpchatclient
|
||||
@@ -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
|
||||
@@ -8,14 +8,17 @@
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
#include <thread>
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
+37
-18
@@ -1,6 +1,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
@@ -9,8 +10,9 @@
|
||||
#include <netinet/in.h>
|
||||
#include <typeinfo>
|
||||
#include <ctime>
|
||||
#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;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user