Correcting.
parent
4fb1542b48
commit
99decfc7e9
310
client_NT117.c
310
client_NT117.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue