diff --git a/main.cpp b/main.cpp index 2a30251..8ca88db 100644 --- a/main.cpp +++ b/main.cpp @@ -11,6 +11,7 @@ #include #include #include +#include using Db = std::vector>; Db database; @@ -68,53 +69,7 @@ void safe_exit(int signum) { exit(signum); } -int main() { - std::cout << "[i] Starting blueis server..." << std::endl; - - signal(SIGINT, safe_exit); - - load_database("db.json"); - int listening_socket = socket(AF_INET, SOCK_STREAM, 0 ); - if (listening_socket < 0) { - std::cerr << "[E] Failed to create socket." << std::endl; - return 1; - } - - int optval = 1; - if (setsockopt(listening_socket, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) { - std::cerr << "[W] Failed to use SO_REUSEADDR. Continuing." << std::endl; - } - - sockaddr_in server_address; - server_address.sin_family = AF_INET; - server_address.sin_port = htons(6379); - server_address.sin_addr.s_addr = INADDR_ANY; - - if (bind(listening_socket, (sockaddr*)&server_address, sizeof(server_address)) < 0) { - std::cerr << "[E] Failed to bind to port 6379. Check for any other running redis or blueis instances." << std::endl; - close(listening_socket); - return 1; - } - - if (listen(listening_socket, 5) < 0) { - std::cerr << "[E] Failed to listen on socket." << std::endl; - close(listening_socket); - return 1; - } - - std::cout << "[i] Server listening on port 6379..." << std::endl; - - sockaddr_in client_address; - socklen_t client_size = sizeof(client_address); - - while (true) { - int client_socket = accept(listening_socket, (sockaddr*)&client_address, &client_size); - if (client_socket < 0) { - std::cerr << "[E] Failed to accept connection." << std::endl; - close(listening_socket); - return 1; - } - std::cout << "[i] Client connected." << std::endl; +void handle_client(int client_socket) { while (true) { char buffer[4096]; int bytes_received = recv(client_socket, buffer, 4096, 0); @@ -165,6 +120,59 @@ int main() { break; } } +} + +int main() { + std::cout << "[i] Starting blueis server..." << std::endl; + + signal(SIGINT, safe_exit); + + load_database("db.json"); + int listening_socket = socket(AF_INET, SOCK_STREAM, 0 ); + if (listening_socket < 0) { + std::cerr << "[E] Failed to create socket." << std::endl; + return 1; + } + + int optval = 1; + if (setsockopt(listening_socket, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) { + std::cerr << "[W] Failed to use SO_REUSEADDR. Continuing." << std::endl; + } + + sockaddr_in server_address; + server_address.sin_family = AF_INET; + server_address.sin_port = htons(6379); + server_address.sin_addr.s_addr = INADDR_ANY; + + if (bind(listening_socket, (sockaddr*)&server_address, sizeof(server_address)) < 0) { + std::cerr << "[E] Failed to bind to port 6379. Check for any other running redis or blueis instances." << std::endl; + close(listening_socket); + return 1; + } + + if (listen(listening_socket, 5) < 0) { + std::cerr << "[E] Failed to listen on socket." << std::endl; + close(listening_socket); + return 1; + } + + std::cout << "[i] Server listening on port 6379..." << std::endl; + + sockaddr_in client_address; + socklen_t client_size = sizeof(client_address); + + while (true) { + int client_socket = accept(listening_socket, (sockaddr*)&client_address, &client_size); + if (client_socket < 0) { + std::cerr << "[E] Failed to accept connection." << std::endl; + close(listening_socket); + return 1; + } + std::thread t(handle_client, client_socket); // Temporarily using the shit method of one thread per client despite the DoS potential until I can get async down. + if (t.joinable()) { + t.detach(); + } + std::cout << "[i] Client connected." << std::endl; }