diff --git a/main.cpp b/main.cpp index 9153c07..70e8f37 100644 --- a/main.cpp +++ b/main.cpp @@ -23,9 +23,7 @@ const static uint16_t PORT = 8956; static bool run = true; -std::mutex lock; -std::condition_variable lock_cv; // not empty or eol -std::list clients; +std::list clients; void sig_handler(int sig_num) { std::cerr << "signalHandler triggered" << std::endl; @@ -138,6 +136,11 @@ void clientShell( int client ) { int sockVal = 1; ::setsockopt( client, SOL_TCP, TCP_NODELAY, &sockVal, 4); + sendInstant( + "\033[90m╔═════════════╗\n" + "\033[90m║ \033[94mHacker 9000 \033[90m║\n" + "\033[90m╚═════════════╝\033[0m\n", client); + sendTyped("Bonjour Eliot!\n\nWhat is your target?\n", client); const std::string target = read(client); @@ -197,26 +200,6 @@ void clientShell( int client ) { ::close( client ); } -void backgroundTask() { - while ( run ) { - int nextClient = -1; - { - std::unique_lock guard(lock); - if( clients.empty() ) { - lock_cv.wait(guard); - } - if ( clients.empty() ) { - // no more clients - break; - } - nextClient = clients.front(); - clients.pop_front(); - } - - clientShell( nextClient ); - } -} - int main () { // init rand seed srand(time(NULL)); @@ -244,10 +227,9 @@ int main () { return 1; } - std::thread backgroundThread( backgroundTask ); - ::signal(SIGINT, sig_handler); ::signal(SIGTERM, sig_handler); + ::signal(SIGPIPE, SIG_IGN); while ( run ) { int status = pollSocket( sock ); @@ -260,24 +242,27 @@ int main () { inet_ntop(addr.sin6_family, &addr.sin6_addr, buffer, INET6_ADDRSTRLEN); std::cout << "accepted Client: " << buffer << std::endl; - { - std::lock_guard guard(lock); - clients.push_back( client ); + clients.push_back( new std::thread(clientShell, client) ); + } + + if ( clients.size() > 1000 ) { + for ( uint32_t i = 0; i < 500; ++i ) { + std::thread* th = clients.front(); + clients.pop_front(); + if( th->joinable() ) { + th->join(); + } + delete th; } - lock_cv.notify_one(); } } } - // notify thread - { - std::lock_guard guard(lock); - clients.clear(); - } - lock_cv.notify_all(); - - if( backgroundThread.joinable() ) { - backgroundThread.join(); + for ( std::thread* th : clients ) { + if( th->joinable() ) { + th->join(); + } + delete th; } ::close(sock);