Correcting.

master
Nick_Kramer 2023-02-16 23:33:16 -04:00
parent 4fb1542b48
commit 99decfc7e9
2 changed files with 280 additions and 109 deletions

View File

@ -11,7 +11,7 @@
#define LENGTH 2048 #define LENGTH 2048
// Global variables // Global variables.
volatile sig_atomic_t flag = 0; volatile sig_atomic_t flag = 0;
int sockfd = 0; int sockfd = 0;
char name[32]; char name[32];
@ -40,6 +40,29 @@ void catch_ctrl_c_and_exit(int sig)
flag = 1; flag = 1;
} }
// Simple crypt function XOR.
void fc_xor(char* s, char* k, char* res)
{
unsigned int len1 = strlen(s);
unsigned int len2 = strlen(k);
unsigned int i = 0;
unsigned int j = 0;
while (i <= len1)
{
if(j == len2)
{
j = 0;
}
res[i] = s[i] ^ k[j];
j++;
i++;
}
}
// Simple Send messages.
void send_msg_handler() void send_msg_handler()
{ {
char message[LENGTH] = {}; char message[LENGTH] = {};
@ -51,10 +74,15 @@ void send_msg_handler()
fgets(message, LENGTH, stdin); fgets(message, LENGTH, stdin);
str_trim_lf(message, LENGTH); str_trim_lf(message, LENGTH);
if (strcmp(message, "exit") == 0) if (strcmp(message, "CMD:exit") == 0)
{ {
break; break;
} }
else if (strcmp(message, "CMD:clear") == 0)
{
system("clear");
printf("[+] - Cleaned... \n");
}
else else
{ {
sprintf(buffer, "%s: %s\n", name, message); sprintf(buffer, "%s: %s\n", name, message);
@ -68,6 +96,54 @@ void send_msg_handler()
catch_ctrl_c_and_exit(2); catch_ctrl_c_and_exit(2);
} }
// Crypt Send messages.
void send_msg_crpt_handler(char* pswd)
{
char message[LENGTH] = {};
char buffer[LENGTH + 32] = {};
char crypt[LENGTH] = {};
while(1)
{
str_overwrite_stdout();
fgets(message, LENGTH, stdin);
str_trim_lf(message, LENGTH);
if(strcmp(message, "SRV:con") == 0)
{
sprintf(buffer, "%s \n", message);
send(sockfd, buffer, strlen(buffer), 0);
}
else if (strcmp(message, "CMD:exit") == 0)
{
break;
}
else if (strcmp(message, "CMD:pswd") == 0)
{
printf("[*] - Key: %s \n", pswd);
}
else if (strcmp(message, "CMD:clear") == 0)
{
system("clear");
printf("[+] - Cleaned... \n");
}
else
{
sprintf(buffer, "%s: %s \n", name, message);
fc_xor(buffer, pswd, crypt);
send(sockfd, crypt, strlen(crypt), 0);
}
bzero(crypt, LENGTH);
bzero(message, LENGTH);
bzero(buffer, LENGTH + 32);
}
catch_ctrl_c_and_exit(2);
}
// Simple Recive messages.
void recv_msg_handler() void recv_msg_handler()
{ {
char message[LENGTH] = {}; char message[LENGTH] = {};
@ -78,117 +154,179 @@ void recv_msg_handler()
if(receive > 0) if(receive > 0)
{ {
printf("%s", message); printf("%s \n", message);
str_overwrite_stdout(); str_overwrite_stdout();
} }
else if(receive == 0) else if(receive == 0)
{ {
break; break;
} }
else else
{ {
// -1 // todo: error - recive!
} }
memset(message, 0, sizeof(message)); memset(message, 0, sizeof(message));
}
}
// Crypt Recive messages.
void recv_msg_crpt_handler(char* pswd)
{
char message[LENGTH] = {};
char decrypt[LENGTH] = {};
while(1)
{
int receive = recv(sockfd, message, LENGTH, 0);
if(receive > 0)
{
if(strncmp(message, "SRV_BOT", 7) == 0)
{
printf("%s", message);
str_overwrite_stdout();
}
else
{
fc_xor(message, pswd, decryt);
printf("%s", decrypt);
str_overwrite_stdout();
}
}
else if(receive == 0)
{
break;
}
else
{
// todo:
}
memset(message, 0, sizeof(message));
memset(decrypt, 0, sizeof(decrypt));
} }
} }
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
// Standard parameters // Standard parameters.
char *ip = "127.0.0.1"; char *ip = "127.0.0.1";
int port = 10117; int port = 10117;
char *pswd = "117"; char *pswd = "117";
if(argc == 4) if(argc == 4)
{ {
printf("[+] - Set User setting.\n"); printf("[+] - Set User setting.\n");
ip = argv[1]; ip = argv[1];
port = atoi(argv[2]); port = atoi(argv[2]);
pswd = argv[3]; pswd = argv[3];
} }
else if(argc == 3) else if(argc == 3)
{ {
printf("[+] - Set User setting.\n"); printf("[+] - Set User setting.\n");
ip = argv[1]; ip = argv[1];
port = atoi(argv[2]); port = atoi(argv[2]);
} }
else if(argc == 2) else if(argc == 2)
{ {
printf("[+] - Set User setting.\n"); printf("[+] - Set User setting.\n");
ip = argv[1]; ip = argv[1];
} }
else if(argc > 4) else if(argc > 4)
{ {
printf("[!] - Error ENTER KEY!\n"); printf("[!] - Error ENTER KEY!\n");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
else else
{ {
printf("[+] - Set default setting.\n"); printf("[+] - Set default setting.\n");
} }
printf("Server IP address: %s \n", ip); printf("Server IP address: %s \n", ip);
printf("Server Port: %d \n", port); printf("Server Port: %d \n", port);
printf("Server Password: %s \n", pswd); printf("Server Password: %s \n", pswd);
signal(SIGINT, catch_ctrl_c_and_exit); signal(SIGINT, catch_ctrl_c_and_exit);
printf("[?] - Please enter your name: "); printf("[?] - Please enter your name: ");
fgets(name, 32, stdin); fgets(name, 32, stdin);
str_trim_lf(name, strlen(name)); str_trim_lf(name, strlen(name));
if(strlen(name) > 32 || strlen(name) < 2) if(strlen(name) > 32 || strlen(name) < 2)
{ {
printf("[!] - Name must be less than 30 and more than 2 characters!\n"); printf("[!] - Name must be less than 30 and more than 2 characters!\n");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
struct sockaddr_in server_addr; struct sockaddr_in server_addr;
/* Socket settings */ // Socket settings.
sockfd = socket(AF_INET, SOCK_STREAM, 0); sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET; server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(ip); server_addr.sin_addr.s_addr = inet_addr(ip);
server_addr.sin_port = htons(port); server_addr.sin_port = htons(port);
// Connect to Server.
// Connect to Server int err = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
int err = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if(err == -1)
if(err == -1)
{ {
printf("[!] - ERROR: connect!\n"); printf("[!] - ERROR: connect!\n");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
// Send name // Send name to Server.
send(sockfd, name, 32, 0); send(sockfd, name, 32, 0);
printf("--=== WELCOME TO THE CHAT NT117 (Client)===--\n"); printf("--=== WELCOME TO THE CHAT NT117 v0 (Client v0.1.6) ===--\n");
pthread_t send_msg_thread; // Creat threads Send||Recive with||not crypt masseges.
if(pthread_create(&send_msg_thread, NULL, (void *) send_msg_handler, NULL) != 0) if(argc == 4)
{ {
printf("[!] - ERROR: pthread!\n"); // Crypt thread Send.
return EXIT_FAILURE; pthread_t send_msg_thread;
} if(pthread_create(&send_msg_thread, NULL, (void *) send_msg_crpt_handler, pswd) != 0)
pthread_t recv_msg_thread;
if(pthread_create(&recv_msg_thread, NULL, (void *) recv_msg_handler, NULL) != 0)
{
printf("[!] - ERROR: pthread!\n");
return EXIT_FAILURE;
}
while(1)
{
if(flag)
{ {
printf("[*] - Exit...\n"); printf("[!] - ERROR: pthread!\n");
break; return EXIT_FAILURE;
} }
}
close(sockfd); // Crypt thread Recive.
return EXIT_SUCCESS; pthread_t recv_msg_thread;
if(pthread_create(&recv_msg_thread, NULL, (void *) recv_msg_crpt_handler, pswd) != 0)
{
printf("[!] - ERROR: pthread!\n");
return EXIT_FAILURE;
}
}
else
{
// Simple thread Send.
pthread_t send_msg_thread;
if(pthread_create(&send_msg_thread, NULL, (void *) send_msg_handler, NULL) != 0)
{
printf("[!] - ERROR: pthread!\n");
return EXIT_FAILURE;
}
// Simple thread Recive.
pthread_t recv_msg_thread;
if(pthread_create(&recv_msg_thread, NULL, (void *) recv_msg_handler, NULL) != 0)
{
printf("[!] - ERROR: pthread!\n");
return EXIT_FAILURE;
}
}
while(1)
{
if(flag)
{
printf("[*] - Exit...\n");
break;
}
}
close(sockfd);
return EXIT_SUCCESS;
} }

View File

@ -17,7 +17,7 @@
static _Atomic unsigned int cli_count = 0; static _Atomic unsigned int cli_count = 0;
static int uid = 10; static int uid = 10;
// Client structure // Client structure.
typedef struct typedef struct
{ {
struct sockaddr_in address; struct sockaddr_in address;
@ -32,7 +32,7 @@ pthread_mutex_t clients_mutex = PTHREAD_MUTEX_INITIALIZER;
void str_overwrite_stdout() void str_overwrite_stdout()
{ {
printf("\r%s", "> "); printf("\r%s", "[>] - ");
fflush(stdout); fflush(stdout);
} }
@ -58,7 +58,7 @@ void print_client_addr(struct sockaddr_in addr)
(addr.sin_addr.s_addr & 0xff000000) >> 24); (addr.sin_addr.s_addr & 0xff000000) >> 24);
} }
// Add clients to queue // Add clients to queue.
void queue_add(client_t *cl) void queue_add(client_t *cl)
{ {
pthread_mutex_lock(&clients_mutex); pthread_mutex_lock(&clients_mutex);
@ -75,7 +75,7 @@ void queue_add(client_t *cl)
pthread_mutex_unlock(&clients_mutex); pthread_mutex_unlock(&clients_mutex);
} }
// Remove clients to queue // Remove clients to queue.
void queue_remove(int uid) void queue_remove(int uid)
{ {
pthread_mutex_lock(&clients_mutex); pthread_mutex_lock(&clients_mutex);
@ -95,7 +95,7 @@ void queue_remove(int uid)
pthread_mutex_unlock(&clients_mutex); pthread_mutex_unlock(&clients_mutex);
} }
// Send message to all clients except sender // Send message to all clients except sender.
void send_message(char *s, int uid) void send_message(char *s, int uid)
{ {
pthread_mutex_lock(&clients_mutex); pthread_mutex_lock(&clients_mutex);
@ -118,7 +118,30 @@ void send_message(char *s, int uid)
pthread_mutex_unlock(&clients_mutex); pthread_mutex_unlock(&clients_mutex);
} }
// Handle all communication with the client // Send message to client info sender.
void send_message_u(char *s, int uid)
{
pthread_mutex_lock(&clients_mutex);
for(int i=0; i<MAX_CLIENTS; ++i)
{
if(clients[i])
{
if(clients[i]->uid == uid)
{
if(write(clients[i]->sockfd, s, strlen(s)) < 0)
{
perror("[!] - ERROR: write to descriptor failed");
break;
}
}
}
}
pthread_mutex_unlock(&clients_mutex);
}
// Handle all communication with the client.
void *handle_client(void *arg) void *handle_client(void *arg)
{ {
char buff_out[BUFFER_SZ]; char buff_out[BUFFER_SZ];
@ -128,7 +151,7 @@ void *handle_client(void *arg)
cli_count++; cli_count++;
client_t *cli = (client_t *)arg; client_t *cli = (client_t *)arg;
// Name // Name.
if(recv(cli->sockfd, name, 32, 0) <= 0 || strlen(name) < 2 || strlen(name) >= 32-1) if(recv(cli->sockfd, name, 32, 0) <= 0 || strlen(name) < 2 || strlen(name) >= 32-1)
{ {
printf("[!] - Didn't enter the name.\n"); printf("[!] - Didn't enter the name.\n");
@ -139,7 +162,6 @@ void *handle_client(void *arg)
strcpy(cli->name, name); strcpy(cli->name, name);
sprintf(buff_out, "%s has joined\n", cli->name); sprintf(buff_out, "%s has joined\n", cli->name);
printf("%s", buff_out); printf("%s", buff_out);
send_message(buff_out, cli->uid);
} }
bzero(buff_out, BUFFER_SZ); bzero(buff_out, BUFFER_SZ);
@ -154,19 +176,30 @@ void *handle_client(void *arg)
int receive = recv(cli->sockfd, buff_out, BUFFER_SZ, 0); int receive = recv(cli->sockfd, buff_out, BUFFER_SZ, 0);
if (receive > 0) if (receive > 0)
{ {
if(strlen(buff_out) > 0)
//printf("[*] - str: %s", buff_out);
if(strncmp(buff_out, "SRV:con", 7) == 0 && strlen(buff_out) > 0)
{
sprintf(buff_out, "SRV_BOT: ID - %u | Username: %s \n", cli->uid ,cli->name);
send_message_u(buff_out, cli->uid);
} //if( && v == '0')
else if(strlen(buff_out) > 0)
{ {
send_message(buff_out, cli->uid); send_message(buff_out, cli->uid);
str_trim_lf(buff_out, strlen(buff_out)); str_trim_lf(buff_out, strlen(buff_out));
printf("%s -> %s\n", buff_out, cli->name); printf("%s -> %s\n", buff_out, cli->name);
} }
else
{
//todo:
}
} }
else if (receive == 0 || strcmp(buff_out, "exit") == 0) else if (receive == 0 || strcmp(buff_out, "CMD:exit") == 0)
{ {
// Output: left user.
sprintf(buff_out, "%s has left\n", cli->name); sprintf(buff_out, "%s has left\n", cli->name);
printf("%s", buff_out); printf("%s", buff_out);
send_message(buff_out, cli->uid);
leave_flag = 1; leave_flag = 1;
} }
else else
@ -178,7 +211,7 @@ void *handle_client(void *arg)
bzero(buff_out, BUFFER_SZ); bzero(buff_out, BUFFER_SZ);
} }
// Delete client from queue and yield thread // Delete client from queue and yield thread.
close(cli->sockfd); close(cli->sockfd);
queue_remove(cli->uid); queue_remove(cli->uid);
free(cli); free(cli);
@ -190,7 +223,7 @@ void *handle_client(void *arg)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
// Standard parameters // Standard parameters.
char *ip = "127.0.0.1"; char *ip = "127.0.0.1";
int port = 10117; int port = 10117;
char *pswd = "117"; char *pswd = "117";
@ -233,13 +266,13 @@ int main(int argc, char **argv)
struct sockaddr_in cli_addr; struct sockaddr_in cli_addr;
pthread_t tid; pthread_t tid;
// Socket settings // Socket settings.
listenfd = socket(AF_INET, SOCK_STREAM, 0); listenfd = socket(AF_INET, SOCK_STREAM, 0);
serv_addr.sin_family = AF_INET; serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(ip); serv_addr.sin_addr.s_addr = inet_addr(ip);
serv_addr.sin_port = htons(port); serv_addr.sin_port = htons(port);
// Ignore pipe signals // Ignore pipe signals.
signal(SIGPIPE, SIG_IGN); signal(SIGPIPE, SIG_IGN);
if(setsockopt(listenfd, SOL_SOCKET,(SO_REUSEPORT | SO_REUSEADDR),(char*)&option,sizeof(option)) < 0) if(setsockopt(listenfd, SOL_SOCKET,(SO_REUSEPORT | SO_REUSEADDR),(char*)&option,sizeof(option)) < 0)
@ -248,28 +281,28 @@ int main(int argc, char **argv)
return EXIT_FAILURE; return EXIT_FAILURE;
} }
// Bind // Bind.
if(bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) if(bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
{ {
perror("[!] - ERROR: Socket binding failed!"); perror("[!] - ERROR: Socket binding failed!");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
// Listen // Listen.
if (listen(listenfd, 10) < 0) if (listen(listenfd, 10) < 0)
{ {
perror("[!] - ERROR: Socket listening failed!"); perror("[!] - ERROR: Socket listening failed!");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
printf("--=== WELCOME TO THE CHAT NT117 (Server) ===--\n"); printf("--=== WELCOME TO THE CHAT NT117 v0 (Server v0.1.4) ===--\n");
while(1) while(1)
{ {
socklen_t clilen = sizeof(cli_addr); socklen_t clilen = sizeof(cli_addr);
connfd = accept(listenfd, (struct sockaddr*)&cli_addr, &clilen); connfd = accept(listenfd, (struct sockaddr*)&cli_addr, &clilen);
// Check if max clients is reached // Check if max clients is reached.
if((cli_count + 1) == MAX_CLIENTS) if((cli_count + 1) == MAX_CLIENTS)
{ {
printf("[?] - Max clients reached. Rejected: "); printf("[?] - Max clients reached. Rejected: ");
@ -279,17 +312,17 @@ int main(int argc, char **argv)
continue; continue;
} }
// Client settings // Client settings.
client_t *cli = (client_t *)malloc(sizeof(client_t)); client_t *cli = (client_t *)malloc(sizeof(client_t));
cli->address = cli_addr; cli->address = cli_addr;
cli->sockfd = connfd; cli->sockfd = connfd;
cli->uid = uid++; cli->uid = uid++;
// Add client to the queue and fork thread // Add client to the queue and fork thread.
queue_add(cli); queue_add(cli);
pthread_create(&tid, NULL, &handle_client, (void*)cli); pthread_create(&tid, NULL, &handle_client, (void*)cli);
// Reduce CPU usage // Reduce CPU usage.
sleep(1); sleep(1);
} }