По гуглил но так ответа и не нашел т.к. вопросы весьма специфические. Использую я данную библиотеку в месте с 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 т.к. опыт уже не малый есть при работе с этой библиотекой.
Я ничего не понял, но ты похоже насилуешь curl. Нужно лишь один раз создать свой curl для каждого потока. И после чего менять лишь необходимое, в твоём случае ссылку - CURLOPT_URL. Хранить куки в файле это тупость, прочитай доку, curl прекрасно хранит их в памяти. Если тебе нужны общие куки на все курлы, то читай про share Interface. >Кстати мог бы в соавторстве написать мини фак по libcurl т.к. опыт уже не малый есть при работе с этой библиотекой. Вместо графоманства лучше почитай документацию на сайте и посмотри пример, которые идут вместе с curl.
Вот так зачем делать? Если у каждого потока свой локальный объект CURL, то зачем критическая секция? Великолепно, передача и возврат объекта String по значению.
2ЕгоАкк Почитай код он и так хранится в памяти 2GRRRL Power Поповоду критических секций я видимо не понял их сути. Я задал вопрос не совсем понимая что мне нужно, такое бывает сори затупил вообщем-то ответы я получил на свои вопросы эксперементальным путем. Тему думаю вообщем-то можно закрывать.
в этой главе хорошо описаны критические секции ГЛАВА 8 Синхронизация потоков в пользовательском режиме Джеффри РИХТЕР Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows
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; }
да да, define же просто подставляется как InLine а переменная curl принимется в этой ф-ции GetPage как аргумент
Господа, подскажите как правильно держать куки в памяти? Обычно делал вот так Но если передавать вместо имени файла переменную типа string, то ничего не происходит