aboutsummaryrefslogtreecommitdiff
path: root/launch-socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'launch-socket.c')
-rwxr-xr-xlaunch-socket.c209
1 files changed, 0 insertions, 209 deletions
diff --git a/launch-socket.c b/launch-socket.c
deleted file mode 100755
index 38cd4eb..0000000
--- a/launch-socket.c
+++ /dev/null
@@ -1,209 +0,0 @@
-#include <Server.h>
-#include <bits/pthreadtypes.h>
-#include <netinet/in.h>
-#include <poll.h>
-#include <pthread.h>
-#include <stdatomic.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <unistd.h>
-#include <launch-socket.h>
-
-struct recv_data_arg {
- int socketFD;
- struct Server* server;
- struct AcceptedSocket* curr_socket;
-};
-
-void* recv_data(void* threadarg)
-{
- struct recv_data_arg* recv_d_arg;
- recv_d_arg = (struct recv_data_arg*)threadarg;
-
- while (recv_d_arg->server->running) {
- char buffer[30000] = { 0 };
- ssize_t amountRecv = recv(recv_d_arg->socketFD, buffer, 30000, 0);
-
- if (recv_d_arg->server->running && recv_d_arg->curr_socket->shutdown == false) {
- if (amountRecv == 0)
- break;
-
- if (recv_d_arg->server->on_message)
- recv_d_arg->server->on_message(recv_d_arg->server, buffer, amountRecv, recv_d_arg->socketFD);
- }
- }
-
- recv_d_arg->curr_socket->shutdown = true;
- close(recv_d_arg->socketFD);
-
- if (recv_d_arg->server->on_disconnect)
- recv_d_arg->server->on_disconnect(recv_d_arg->server, recv_d_arg->socketFD);
- free(recv_d_arg);
-
- pthread_exit(NULL);
-}
-
-
-void cleanup_conns(struct Server* server)
-{
- pthread_mutex_lock(&server->list_lock);
- if (server->accepted_socket) {
- struct AcceptedSocket* sel_socket = server->accepted_socket;
- struct AcceptedSocket* prev_socket = server->accepted_socket;
- struct AcceptedSocket* prev2_socket = server->accepted_socket;
-
- while (sel_socket != NULL) {
- sel_socket = sel_socket->next;
- if (prev_socket->shutdown == true) {
- if (prev_socket == server->accepted_socket) {
- pthread_join(server->accepted_socket->thread_id,NULL);
- free(server->accepted_socket);
- server->accepted_socket = sel_socket;
- } else {
- pthread_join(prev2_socket->next->thread_id,NULL);
- free(prev2_socket->next);
- prev2_socket->next = sel_socket;
- }
- } else {
- prev2_socket = prev_socket;
- }
- prev_socket = sel_socket;
- }
- }
- pthread_mutex_unlock(&server->list_lock);
-}
-
-void* cleanup_loop(void* threadarg)
-{
- struct Server* server;
- server = (struct Server*)threadarg;
- while (server->running) {
- cleanup_conns(server);
- for (int i = 0; i < 60 && server->running; i++) {
- sleep(1);
- }
- }
-
- pthread_exit(NULL);
-}
-
-struct AcceptedSocket* acceptIncoming(struct Server* server)
-{
- int serverSocketFd = server->socket;
-
- struct sockaddr_in clientAddress;
- socklen_t ClientAddressSize = sizeof(struct sockaddr);
- int clientSocketFD = accept(serverSocketFd, (struct sockaddr*)&clientAddress, &ClientAddressSize);
-
- if (server->running) {
- struct AcceptedSocket* acceptedSocket = malloc(sizeof(struct AcceptedSocket));
- acceptedSocket->address = clientAddress;
- acceptedSocket->socketFD = clientSocketFD;
- acceptedSocket->succ = clientSocketFD > 0;
- acceptedSocket->next = NULL;
- acceptedSocket->shutdown = false;
-
- if (!acceptedSocket) {
- acceptedSocket->error = clientSocketFD;
- } else {
- if (server->running) {
- struct AcceptedSocket* sel_socket = server->accepted_socket;
-
- if (sel_socket == NULL) {
- server->accepted_socket = acceptedSocket;
- } else {
- while (1) {
- if (sel_socket->next == NULL) {
- sel_socket->next = acceptedSocket;
- break;
- } else {
- sel_socket = sel_socket->next;
- }
- }
- }
- }
- }
- return acceptedSocket;
- } else {
- return NULL;
- }
-}
-
-void* await_client(void* threadarg)
-{
- struct Server* server;
- server = (struct Server*)threadarg;
- while (server->running) {
- struct AcceptedSocket* new_socket = acceptIncoming(server);
- if (server->running) {
- if (new_socket->succ == 0) {
- free(new_socket);
- } else {
-
- struct recv_data_arg* recv_d_arg = malloc(sizeof(*recv_d_arg));
- recv_d_arg->socketFD = new_socket->socketFD;
- recv_d_arg->server = server;
- recv_d_arg->curr_socket = new_socket;
-
- int thread_err = pthread_create(&new_socket->thread_id, NULL, recv_data, recv_d_arg);
- if (thread_err != 0) {
- fprintf(stderr, "ERROR CREATING THREAD FOR CLIENT: %d\n", thread_err);
- perror("await client error");
- exit(-1);
- }
- }
- }
- }
-
- pthread_exit(NULL);
-}
-
-int server_close_socket(struct Server* server)
-{
- server->running = false;
- pthread_join(server->cleanup_thread_id, NULL);
-
- int shuterr = shutdown(server->socket, SHUT_RDWR);
- pthread_join(server->server_thread_id, NULL);
- int closeerr = close(server->socket);
-
- cleanup_conns(server);
- pthread_mutex_destroy(&server->list_lock);
- return shuterr+closeerr;
-}
-
-int launch_socket(struct Server* server)
-{
- pthread_mutex_init(&server->list_lock, NULL);
-
- int thread_err2 = pthread_create(&server->cleanup_thread_id, NULL, cleanup_loop, (void*)server);
- if (thread_err2 != 0) {
- fprintf(stderr, "ERROR WITH CLEANUP LOOP: %d\n", thread_err2);
- perror("cleanup loop err");
- exit(-1);
- }
-
- int thread_err = pthread_create(&server->server_thread_id, NULL, await_client, (void*)server);
- if (thread_err != 0) {
- fprintf(stderr, "ERROR WITH AWAIT CLIENT: %d\n", thread_err);
- perror("await client error");
- exit(-1);
- }
-
- return 0;
-}
-
-void broadcast(struct Server* server, int socketFD, char* message){
- pthread_mutex_lock(&server->list_lock);
- struct AcceptedSocket* sel_socket = server->accepted_socket;
- while (sel_socket != NULL) {
- if (sel_socket->shutdown == false && sel_socket->socketFD != socketFD) {
- send(sel_socket->socketFD, message, 30000, 0);
- }
- sel_socket = sel_socket->next;
- }
- pthread_mutex_unlock(&server->list_lock);
-} \ No newline at end of file