2015-03-27 2 views
2

Моя текущая настройка завивки, чтобы вызвать веб-страницу, сохранить ее в строке и повторить процесс после сна в течение секунды. Это код для записи в строку:Curl вызывает ошибку openssl

#include <curl/curl.h> 
#include <string> 
#include <iostream> 
#include <thread> 
#include <chrono> 

size_t curl_writefunc(void* ptr, size_t size, size_t nmemb, std::string* data) 
{ 
    data->append((const char*)ptr, size * nmemb); 
    return size * nmemb; 
} 

void curl_handler(std::string& data) 
{ 
    int http_code = 0; 
    CURL* curl; 
    // Initialize cURL 
    curl = curl_easy_init(); 

    // Set the function to call when there is new data 
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_writefunc); 

    // Set the parameter to append the new data to 
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data); 

    // Set the URL to download; just for this question. 
    curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/"); 

    // Download 
    curl_easy_perform(curl); 

    // Get the HTTP response code 
    curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); 

    // Clean up 
    curl_easy_cleanup(curl); 
    curl_global_cleanup(); 
} 

int main() 
{ 
    bool something = true; 
    std::string data; 
    while (something) 
    { 
     curl_handler(data); 
     std::cout << data << '\n'; 
     data.clear(); 
     std:: this_thread:: sleep_for (std:: chrono:: seconds(1)); 
    } 
} 

Однако он работает в проблему около 20 минут в режиме исполнения, и это сообщение, которое она противостоит мне:

140377776379824:error:02001018:system library:fopen:Too many open files:bss_file.c:173:fopen('/etc/ssl/openssl.cnf','rb') 
140377776379824:error:2006D002:BIO routines:BIO_new_file:system lib:bss_file.c:178: 
140377776379824:error:0E078002:configuration file routines:DEF_LOAD:system lib:conf_def.c:199: 

кажется, проистекают из файл openssl, который не закрывается, как только он заполнил свою задачу в единственной итерации. Если итерация повторяется несколько раз, открытые файлы складываются и в какой-то момент связаны с ошибкой. Я все еще очень начинающий программист, и поэтому не хочу начинать возиться с openSSL, поэтому я пришел сюда, чтобы спросить: может быть, есть решение для такого рода проблем. Может ли это быть разрешено путем объявления объекта curl за пределами отозванной функции?

+2

Что делать, если вы не вызываете 'curl_global_cleanup()' внутри 'curl_handler()', но вызываете его только один раз ближе к концу 'main()' вместо? – timrau

+0

@timrau, спасибо за подсказку, он начал толкать меня в правильном направлении. Проблема в том, что некоторые файлы могут оставаться открытыми, даже после очистки, это может вызвать проблемы с параллелизмом, но, скорее, избыток ресурсов. – TheCharlatan

ответ

0

Что нужно сделать, это просто объявить дескриптор и его настройки перед получением данных. Затем в цикле повторяется только фактическая загрузка и сопровождающий ее ответ. Рекомендуется повторно использовать обработчик настолько часто, насколько это необходимо, так как часть его ресурсов (например, файлы, открытые в этом сеансе), возможно, потребуется повторно развернуть.

Смежные вопросы