вопрос по libcurl

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Gin, 3 Sep 2010.

  1. Gin

    Gin Elder - Старейшина

    Joined:
    11 Sep 2008
    Messages:
    133
    Likes Received:
    7
    Reputations:
    4
    По гуглил но так ответа и не нашел т.к. вопросы весьма специфические. Использую я данную библиотеку в месте с Builder. Ну чтож начнем.

    Есть некоторый класс-парсер в ф-ции MainQuerys реализованны все основные действия парсера, но мне захотелось тело этой ф-ции разбить на более мелкие подфункции т.к. слишком много кода и уже воспринимать тяжеловато. Парсер сам многопоточный так что для работы с curl использую метод критических сикций.

    Code:
    EnterCriticalSection(&Form3->CS);
    CURL *curl;
    curl = curl_easy_init();
    LeaveCriticalSection(&Form3->CS);
    
    есть так же переменные внутри самой функции такие как
    Code:
    String data,cookie,proxy;
    
    суть переменных в самих названиях

    Работу парсера условно можно разделить на 3 этапа авторизация, граббинг и сохранение.

    Вот мы подошли к сути вопроса, когда я инициализирую curl некоторыми параметрами, а именно User-Agent, Proxy, Cookie. они сохраняются во внутренней структуре или же каждый раз когда я буду передовать указатель на экземпляр CURL мне нужно заного их инициализировать.

    А именно чтоб я снее было приведу примеры.

    Code:
    EnterCriticalSection(&Form3->CS);
    CURL *curl;
    curl = curl_easy_init();
    LeaveCriticalSection(&Form3->CS);
    
    curl_easy_setopt(curl,CURLOPT_URL,"somesite");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,Writer);
    curl_easy_setopt(curl, CURLOPT_PROXYTYPE,CURLPROXY_SOCKS5);
    curl_easy_setopt(curl,CURLOPT_PROXY,proxy);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA,&data);
    curl_easy_setopt(curl,CURLOPT_TIMEOUT,50);
    curl_easy_setopt(curl, CURLOPT_USERAGENT,Form3->GetUserAgent());
    curl_easy_setopt(curl, CURLOPT_COOKIEJAR,cookie);
    curl_easy_setopt (curl, CURLOPT_COOKIEFILE,cookie);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER,0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST,0L);
    curl_easy_perform(curl);
    
    Это пример того кода который я хочу выделить в отдельную функцию. Вот пример функции в которую я выделил этот код

    Code:
    String Parser::GetPage(CURL* curl,String& cockie,String proxy){
    String data;
    curl_easy_setopt(curl,CURLOPT_URL,"somesite");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,Writer);
    curl_easy_setopt(curl, CURLOPT_PROXYTYPE,CURLPROXY_SOCKS5);
    curl_easy_setopt(curl,CURLOPT_PROXY,proxy);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA,&data);
    curl_easy_setopt(curl,CURLOPT_TIMEOUT,50);
    curl_easy_setopt(curl, CURLOPT_USERAGENT,Form3->GetUserAgent());
    curl_easy_setopt(curl, CURLOPT_COOKIEJAR,cookie);
    curl_easy_setopt (curl, CURLOPT_COOKIEFILE,cookie);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER,0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST,0L);
    curl_easy_perform(curl);
    return data;
    }
    
    Вопрос теперь в следующем те настройки, которые я сделал в этой функции перенесуться они в ф-цию авторизации и грабинга либо каждый раз нужно заново проводить инициализацию :? Может я как-то скомканно объяснил, но вот как могу.

    PS
    Кстати мог бы в соавторстве написать мини фак по libcurl т.к. опыт уже не малый есть при работе с этой библиотекой.
     
  2. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    Я ничего не понял, но ты похоже насилуешь curl.
    Нужно лишь один раз создать свой curl для каждого потока. И после чего менять лишь необходимое, в твоём случае ссылку - CURLOPT_URL. Хранить куки в файле это тупость, прочитай доку, curl прекрасно хранит их в памяти.
    Если тебе нужны общие куки на все курлы, то читай про share Interface.

    >Кстати мог бы в соавторстве написать мини фак по libcurl т.к. опыт уже не малый есть при работе с этой библиотекой.
    Вместо графоманства лучше почитай документацию на сайте и посмотри пример, которые идут вместе с curl.
     
  3. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Вот так зачем делать? Если у каждого потока свой локальный объект CURL, то зачем критическая секция?

    Великолепно, передача и возврат объекта String по значению.
     
  4. Gin

    Gin Elder - Старейшина

    Joined:
    11 Sep 2008
    Messages:
    133
    Likes Received:
    7
    Reputations:
    4
    2ЕгоАкк
    Почитай код он и так хранится в памяти

    2GRRRL Power
    Поповоду критических секций я видимо не понял их сути.

    Я задал вопрос не совсем понимая что мне нужно, такое бывает сори затупил вообщем-то ответы я получил на свои вопросы эксперементальным путем. Тему думаю вообщем-то можно закрывать.
     
  5. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    в этой главе хорошо описаны критические секции
    ГЛАВА 8 Синхронизация потоков в пользовательском режиме
    Джеффри РИХТЕР
    Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows
     
  6. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    Code:
    String Parser::GetPage(CURL* curl,String& cockie,String proxy){
    String data;
    curl_easy_setopt(curl,CURLOPT_URL,"somesite");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,Writer);
    curl_easy_setopt(curl, CURLOPT_PROXYTYPE,CURLPROXY_SOCKS5);
    curl_easy_setopt(curl,CURLOPT_PROXY,proxy);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA,&data);
    curl_easy_setopt(curl,CURLOPT_TIMEOUT,50);
    curl_easy_setopt(curl, CURLOPT_USERAGENT,Form3->GetUserAgent());
    curl_easy_setopt(curl, CURLOPT_COOKIEJAR,cookie);
    curl_easy_setopt (curl, CURLOPT_COOKIEFILE,cookie);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER,0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST,0L);
    curl_easy_perform(curl);
    return data;
    }
    
    можно сократить
    Code:
    #define SET(Opt, Val) curl_easy_setopt(curl, CURLOPT_##Opt, Val)
    
    String Parser::GetPage(CURL *curl, String& cookie, String proxy)
    {
    	String data;
    	SET(URL, "somesite");
    	SET(WRITEFUNCTION, Writer);
    	SET(PROXYTYPE, CURLPROXY_SOCKS5);
    	SET(PROXY, proxy);
    	SET(WRITEDATA, &data);
    	SET(TIMEOUT, 50);
    	SET(USERAGENT, Form3->GetUserAgent());
    	SET(COOKIEJAR, cookie);
    	SET(COOKIEFILE, cookie);
    	SET(SSL_VERIFYPEER, 0L);
    	SET(SSL_VERIFYHOST, 0L);
    	curl_easy_perform(curl);
    	return data;
    }
    
     
  7. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    186
    Reputations:
    5
    Я тупанул
     
    #7 rudi, 5 Sep 2010
    Last edited: 5 Sep 2010
  8. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    186
    Reputations:
    5
    да да, define же просто подставляется как InLine
    а переменная curl принимется в этой ф-ции GetPage как аргумент
     
  9. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    ну да все так :)
     
  10. D4mp

    D4mp Banned

    Joined:
    28 Jul 2010
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Господа, подскажите как правильно держать куки в памяти? Обычно делал вот так
    Но если передавать вместо имени файла переменную типа string, то ничего не происходит