diff --git a/main.cpp b/main.cpp index 0a695a6..e0d0498 100644 --- a/main.cpp +++ b/main.cpp @@ -1,38 +1,65 @@ #include #include +#include #include -size_t callback(char* ptr,size_t size,size_t nmemb,std::string* stream){ - size_t s=size*nmemb; - stream->append(ptr,s); - return s; +static const char* URL = "https://uibi-mu.click/uibi-mu"; +static const int CONCURRENCY = 10000; + +size_t write_callback(char* ptr, size_t size, size_t nmemb, void* userdata) { + return size * nmemb; } -int main(){ - const char url[] = "https://uibi-mu.click/uibi-mu"; +CURL* create_easy() { + CURL* easy = curl_easy_init(); + curl_easy_setopt(easy, CURLOPT_URL, URL); + curl_easy_setopt(easy, CURLOPT_WRITEFUNCTION, write_callback); + curl_easy_setopt(easy, CURLOPT_SSL_VERIFYPEER, 0L); + curl_easy_setopt(easy, CURLOPT_SSL_VERIFYHOST, 0L); + curl_easy_setopt(easy, CURLOPT_PRIVATE, easy); + return easy; +} - for (int i=0;i<100000;i++) { - CURL *curl; - CURLcode curlCode; - std::string res = ""; +int main() { + curl_global_init(CURL_GLOBAL_DEFAULT); - curl = curl_easy_init(); - if (curl == NULL) { - std::cout << "curl error" << std::endl; - return 1; - } - curl_easy_setopt(curl, CURLOPT_URL, url); - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER,0); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (std::string*)&res); + CURLM* multi = curl_multi_init(); + int still_running = 0; - curlCode = curl_easy_perform(curl); - curl_easy_cleanup(curl); - if (curlCode == CURLE_OK) { - std::cout << res << std::endl; - } else { - std::cout << "curl error" << curlCode << std::endl; + for (int i = 0; i < CONCURRENCY; i++) { + CURL* easy = create_easy(); + curl_multi_add_handle(multi, easy); + } + + curl_multi_perform(multi, &still_running); + + while (still_running) { + int numfds; + curl_multi_wait(multi, NULL, 0, 1000, &numfds); + curl_multi_perform(multi, &still_running); + + CURLMsg* msg; + int msgs_left; + + while ((msg = curl_multi_info_read(multi, &msgs_left))) { + if (msg->msg == CURLMSG_DONE) { + CURL* easy = msg->easy_handle; + + long http_code = 0; + curl_easy_getinfo(easy, CURLINFO_RESPONSE_CODE, &http_code); + std::cout << "HTTP: " << http_code << std::endl; + + curl_multi_remove_handle(multi, easy); + curl_easy_cleanup(easy); + + CURL* new_easy = create_easy(); + curl_multi_add_handle(multi, new_easy); + still_running++; + } } } + + curl_multi_cleanup(multi); + curl_global_cleanup(); return 0; } \ No newline at end of file