diff --git a/Main.c b/Main.c index 889467b456a7fd6094fdf04b1478e1de212d8095..53de1e4e56bbce831adb1b9a48c20fbb1759215d 100644 --- a/Main.c +++ b/Main.c @@ -19,6 +19,7 @@ // Import headers. +#include <arpa/inet.h> #include <ctype.h> #include <netdb.h> #include <pthread.h> @@ -38,16 +39,24 @@ // Variables. -// pthread_cond_t thread_finished; +struct conn_obj { + int* index; + int conn_fd; + struct sockaddr_in* client_address; +}; + int threads_finished; int thread_free[THREAD_MAX]; int thread_joinable[THREAD_MAX]; +struct sockaddr_in server_address; +unsigned short port_number; pthread_t* thread_array; // Method Declaration. void* serve_request(); // Handles processing of a request from a new thread. void join_threads(); // Attempts to join all finished child threads. +void send_response(); // Generates and sends http response to requesting client. /** @@ -60,9 +69,8 @@ int main(int argc, char* argv[]) { int listen_fd; int con_fd; int thread_created; - unsigned short port_number; char* media_path; - struct sockaddr_in server_address; + struct sockaddr_in* client_address; socklen_t address_len; pthread_attr_t attr; size_t stacksize; @@ -88,7 +96,7 @@ int main(int argc, char* argv[]) { } else { strcat(media_path, "/Media"); } - printf("Media Path: %s\n", media_path); + printf("Media Path: %s\n\n", media_path); // Creates socket and sets listener file descriptor. if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { @@ -133,13 +141,14 @@ int main(int argc, char* argv[]) { thread_joinable[index] = 0; } - printf("Threading established. Awaiting connection...\n"); + printf("Threading established. Awaiting connection...\n\n"); // Run indefinitely, accepting new connections and creating new threads for each. while (1) { // Check for successful connection. - if ((con_fd = accept(listen_fd, (struct sockaddr*) &server_address, (socklen_t*) &address_len)) >= 0) { + client_address = calloc(1, sizeof(struct sockaddr)); + if ((con_fd = accept(listen_fd, (struct sockaddr*) client_address, (socklen_t*) &address_len)) >= 0) { printf("Recieving request...\n"); // Loop until new thread is created. @@ -173,7 +182,10 @@ int main(int argc, char* argv[]) { } // A connection has been established. Open new thread. - pthread_create(&thread_array[0], &attr, serve_request, (void*) copy_int(&index)); + char* ip = inet_ntoa(client_address->sin_addr); + printf("Client IP: %s\n", ip); + // pthread_create(&thread_array[0], &attr, serve_request, (void*) copy_int(&index)); + pthread_create(&thread_array[0], &attr, serve_request, (void*) &((struct conn_obj) {copy_int(&index), -1, client_address})); } // Check if any threads have finished. If so, join. @@ -187,14 +199,16 @@ int main(int argc, char* argv[]) { /** * Handles processing of a request from a new thread. */ -void* serve_request(int* index) { - printf("\nRequest recieved and thread #%d created!\n", *index); - printf("Not doing anything about it though. Terminating thread.\n\n"); +void* serve_request(struct conn_obj* connection) { + printf("\nRequest recieved and thread #%d created!\n", *connection->index); + send_response(connection); + printf("Terminating thread.\n\n"); // Set values so that main can figure out what child threads are done executing. threads_finished = 1; - thread_joinable[*index] = 1; - free(index); + thread_joinable[*connection->index] = 1; + free(connection->index); + free(connection->client_address); // Exit thread. pthread_exit((void*) NULL); @@ -219,3 +233,27 @@ void join_threads() { } threads_finished = 0; } + + +/** + * Generates and sends http response to requesting client. + */ +void send_response(struct conn_obj connection) { + char* temp_string; + char* response_buffer = calloc(BUFFER_SIZE, sizeof(char*)); + + strcat(response_buffer, "HTTP/1.2 200 OK\r\n"); + + strcat(response_buffer, "Host: "); + temp_string = inet_ntoa(server_address.sin_addr); + strcat(response_buffer, temp_string); + strcat(response_buffer, ":"); + temp_string = calloc(10, sizeof(char*)); + sprintf(temp_string, "%u", port_number); + strcat(response_buffer, temp_string); + strcat(response_buffer, "\r\n"); + strcat(response_buffer, "Content-Type: text/html\r\n"); + strcat(response_buffer, "\r\n"); + + printf("%s\n", response_buffer); +}