On 25-Oct-07, at 3:55 PM, Michael Hecker wrote: > Hello, > I wrote a little class for the communication via curl. >
You should send a message to curl-library mailing-list http://cool.haxx.se/mailman/listinfo/curl-library This is the C++ wrapper mailing-list, which isn't supported by the cURL team. > If I call > > curl_handle = curl_easy_init(); > and > curl_easy_cleanup(curl_handle); > > for every single request, everything works fine. > But I recognized that I can perform a large number of requests much > quicker, if I call curl_handle = curl_easy_init(); only at the > startup of my application and > curl_easy_cleanup(curl_handle); only in the end. > But after a few minutes the application crashes. I suppose, because > something went wrong in a request and curl_easy_init and > curl_easy_cleanup were not called for the next request. > > What can I do? > > Thanks, > Michael > > Here is my Class: > > CCommunicator::CCommunicator() > { > repeat_requests = 4; > agent_name = "Mozilla/5.0 (Windows; U; Windows NT 5.1; > de; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7"; > > // Initiierung der Curl-Session > curl_handle = curl_easy_init(); > > if (curl_handle) > { > cookie_engine_started = false; > > // User-Agent bestimmen > curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, agent_name); > > // Timeout > curl_easy_setopt(curl_handle, CURLOPT_CONNECTTIMEOUT, (int) > 5); > curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, (int) 5); > } > } > > CCommunicator::~CCommunicator() > { > // Aufräumen > curl_easy_cleanup(curl_handle); > } > > // > // Curl: Reallocation of the memory > // > void *myrealloc(void *ptr, size_t size) > { > if(ptr) return realloc(ptr, size); > else return malloc(size); > } > // > // Curl: Callback zum Speichern der Daten > // > size_t WriteMemoryCallback(void *ptr, size_t size, size_t > nmemb, void *data) > { > size_t realsize = size * nmemb; > struct CCommunicator_MemoryStruct *mem = (struct > CCommunicator_MemoryStruct *)data; > > mem->memory = (char *)myrealloc(mem->memory, mem->size + > realsize + 1); > > if (mem->memory) > { > memcpy(&(mem->memory[mem->size]), ptr, realsize); > mem->size += realsize; > mem->memory[mem->size] = 0; > } > > return realsize; > } > // > // Curl: Send-Request > // > bool CCommunicator::execute(CString url, CString &quellcode, > CString POST) > { > quellcode = ""; > struct CCommunicator_MemoryStruct chunk; > > chunk.memory = NULL; > chunk.size = 0; > > bool rueckgabe = true; > > if (curl_handle) > { > // Optionen der Session > // > // Einstellungen für https > if(url.Find("https")!=-1) > { > curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, > FALSE); > curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 2); > } > > // URL, die abgefragt werden soll > curl_easy_setopt(curl_handle, CURLOPT_URL, url); > > // Klasse soll alle Daten an WriteMemoryCallback senden > curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, > WriteMemoryCallback); > > // Über gabe des "chunk" structs an die Callback-Funktion > curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *) > &chunk); > > // Cookies > if(cookie_engine_started) > curl_easy_setopt(curl_handle, CURLOPT_COOKIELIST, > "ALL"); // Alte Cookies löschen > > if(url.Find("betfair")!=-1 && url.Find > ("LoadMarketDataAction")!=-1) > { > // Cookie-Engine starten > if(!cookie_engine_started) > { > curl_easy_setopt(curl_handle, CURLOPT_COOKIEFILE, ""); > curl_easy_setopt(curl_handle, CURLOPT_COOKIELIST, > "ALL"); > cookie_engine_started = true; > } > > char nline[256]; > > // Cookies setzen > // > _snprintf(nline, 256, > "Set-Cookie: > betexPtk=betexLocale=en~betexRegion=GBR~betexCurrency=EUR~betexTimeZon > e=Europe/Berlin;" > "expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; > domain=.betfair.com"); > > curl_easy_setopt(curl_handle, CURLOPT_COOKIELIST, > nline); > // > //// > } > > // POST - Daten > if(POST!="") > curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, POST); > // > //// > > // > // Anfrage ausführen > // > result = curl_easy_perform(curl_handle); > > if (result != CURLE_OK) { > fprintf(stderr, "Curl perform failed: %s\n", > curl_easy_strerror(result)); > quellcode.Format("Anfrage wurde nicht beantwortet.\r > \nBitte überprüfen Sie die Internetverbindung!\r\n\r\nMeldung: % > s",curl_easy_strerror(result)); > rueckgabe = false; > } > // > // TMP: Ausgabe > // > if(quellcode=="" && rueckgabe) > quellcode = chunk.memory; > > } // Schließt: if(curl_handle) > else > { > quellcode = "curl_handle konnte nicht initiiert werden!\r > \nBitte kontaktieren Sie den Support."; > rueckgabe = false; > } > > // 1. Ausnahmefehler > if(quellcode.Find("The requested URL could not be retrieved")!=-1) > rueckgabe = false; > > // 2. Ausnahmefehler > if(quellcode.Find("Service Unavailable")!=-1) > rueckgabe = false; > > // > // Aufräumen > // > if(chunk.memory) > free(chunk.memory); > > return rueckgabe; > } > > bool CCommunicator::communicate(CString url, CString &quellcode, > CString POST) > { > Global::cs_communicator.Lock(); > > bool res = execute(url,quellcode,POST); > > Global::cs_communicator.Unlock(); > return res; > } > > > -- > Psssst! Schon vom neuen GMX MultiMessenger gehört? > Der kanns mit allen: http://www.gmx.net/de/go/multimessenger > _______________________________________________ > cURLpp mailing list > [email protected] > http://www.rrette.com/mailman/listinfo/curlpp _______________________________________________ cURLpp mailing list [email protected] http://www.rrette.com/mailman/listinfo/curlpp
