diff options
Diffstat (limited to 'launch-socket.c')
| -rwxr-xr-x | launch-socket.c | 209 |
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 |
