From ff817b899bf1e922b99f87ed7b3a0137f1106d09 Mon Sep 17 00:00:00 2001 From: Nayan <33187059+GShadow5@users.noreply.github.com> Date: Tue, 6 May 2025 16:05:06 -0400 Subject: [PATCH] add poll to handle user input and web requests at the same time --- webserver.c | 54 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/webserver.c b/webserver.c index 358d4e9..ab77f1f 100644 --- a/webserver.c +++ b/webserver.c @@ -1,9 +1,12 @@ #include +#include #include #include #include #include #include +#include +#include #include "client_handler.h" @@ -18,7 +21,6 @@ int main(int argc, char **argv) { } // Socket address config - server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(8080); @@ -36,19 +38,47 @@ int main(int argc, char **argv) { exit(1); } + // Set up poll to monitor stdin and server + struct pollfd fds[2]; + fds[0].fd = STDIN_FILENO; + fds[0].events = POLLIN; + fds[1].fd = server; + fds[1].events = POLLIN; + + // Main loop while (1) { - struct sockaddr_in client_addr; - socklen_t client_len = sizeof(client_addr); - int *client = malloc(sizeof(int)); + int ret = poll(fds, 2, 0); + if (ret > 0) { + // Check if stdin has data + if (fds[0].revents & POLLIN) { + char c; + read(STDIN_FILENO, &c, 1); + if (c == 'q') { + close(server); + printf("Server closed\n"); + break; + } + } - *client = accept(server, (struct sockaddr *)&client_addr, &client_len); - if (client < 0) { - perror("Failed to accept client"); - continue; + // Check if server has data + if (fds[1].revents & POLLIN) { + struct sockaddr_in client_addr; + socklen_t client_len = sizeof(client_addr); + int *client = malloc(sizeof(int)); + + *client = accept(server, (struct sockaddr *)&client_addr, + &client_len); + if (client < 0) { + perror("Failed to accept client"); + continue; + } + + pthread_t thread; + pthread_create(&thread, NULL, client_handler, (void *)client); + pthread_detach(thread); + } } - - pthread_t thread; - pthread_create(&thread, NULL, client_handler, (void *)client); - pthread_detach(thread); } + + return 0; } \ No newline at end of file