curl-library
Persistant connection with a memory problem
Date: Sun, 25 May 2008 09:55:50 +0200
Hello,
I think I followed your example (persistant.c) and wrote a class, which 
connects to a server and holds the connection.
 My main problem is that private bytes (virtual memory) and working set 
( physical memory) are continously getting bigger and bigger.
What can I do about that?
Additionally, I'm getting something like 100.000 'page faults' per 
seconds. What can I do about that?
I'm working on Windows XP with VC++.
Thanks,
Michael
The main parts:
Communicator::Communicator(CWnd* pParent /*=NULL*/)
{
    ParentDlg = pParent;
    //
    // Für cURL
    //
        curl_global_init(CURL_GLOBAL_ALL);
        curl_handle = curl_easy_init();
        // Rahmeninformationen der Kommunikation
//            curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1);
//            curl_easy_setopt(curl_handle, CURLOPT_DEBUGFUNCTION, 
Communicator::my_trace);
//            curl_easy_setopt(curl_handle, CURLOPT_DEBUGDATA, this);
        // Content encoding
            curl_easy_setopt(curl_handle, CURLOPT_ENCODING, "gzip,deflate");
        // Weiterleitungen folgen
            curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1);
        // SSL | Host verifizieren
            curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 1);
        // SSL | Pfad der pem-Datei
            curl_easy_setopt(curl_handle, CURLOPT_CAINFO, 
"C:\\Project\\libcurl\\VisualStudio\\MyApplication\\Release\\cacert.pem");
        // Cookie-Engine starten
            curl_easy_setopt(curl_handle, CURLOPT_COOKIEFILE, "");
        // Alte Cookies löschen
            curl_easy_setopt(curl_handle, CURLOPT_COOKIELIST, "ALL");
        // Individuelle Header Informationen
            slist=NULL;
            slist = curl_slist_append(slist, "Accept: 
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
            slist = curl_slist_append(slist, "Accept-Language: 
de-de,de;q=0.8,en-us;q=0.5,en;q=0.3");
            slist = curl_slist_append(slist, "Accept-Charset: 
ISO-8859-1,utf-8;q=0.7,*;q=0.7");
            slist = curl_slist_append(slist, "Keep-Alive: 300");
            slist = curl_slist_append(slist, "Connection: keep-alive");
            curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, slist);
}
bool Communicator::communicate(CString url, CString POST_data, CString 
&quellcode, CString location)
{
    // Variablen
    bool rueckgabewert=true;
    chunk_mem chunk1;
    // Wenn POST, dann hier Daten an cURL übergeben
    if(POST_data.GetLength()>0)
        curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, POST_data);
    // Klasse soll alle Daten an WriteMemoryCallback senden
    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, 
myWriteMemoryCallback);
    // Über gabe des "chunk" structs an die Callback-Funktion
    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk1);
   
    // Abzufragende URL
    curl_easy_setopt(curl_handle, CURLOPT_URL,    url);
       
    // Abfrage ausführen
    CURLcode result = curl_easy_perform(curl_handle);
   
    //
    // Response Code ermitteln
    //
        long responseCode;
        CURLcode r = curl_easy_getinfo(curl_handle, 
CURLINFO_RESPONSE_CODE, &responseCode);
    //
    // Quellcode für die Rückgabe speichern
    //
        if( result==CURLE_OK && responseCode==200 )
            quellcode=chunk1.memory;
        else
        {
            rueckgabewert=false;
            quellcode.Format("COMMUNICATION ERROR:\r\nMeldung: 
%s",curl_easy_strerror(result));
        }
        if(rueckgabewert)
        {
            if(    quellcode.Find("Service Unavailable")                
!=-1        ||
                quellcode.Find("The requested URL could not be 
retrieved")    !=-1        )
            {
                quellcode    = "COMMUNICATION ERROR:\r\nMeldung: 
Bekannter Fehler!";
                rueckgabewert    = false;
            }
        }
    //
    ////
    // Wenn POST dann hier wieder auf GET wechseln
    if(POST_data.GetLength()>0)
    curl_easy_setopt(curl_handle, CURLOPT_HTTPGET, 1);
    // bwin_chunk aufräumen
    if(chunk1.memory)
    free(chunk1.memory);
    return rueckgabewert;
}
Communicator::~Communicator()
{
    curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, NULL);
    curl_slist_free_all(slist);
    curl_easy_cleanup(curl_handle);
}
Received on 2008-05-25