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

Reply via email to