(ungelöst)cURL access violation / (gelöst)unvollständige downloads



  • Guten abend erstmal,
    ich hab ein Problem mit libcurl.
    Ich hab es jetzt mit MSVC und Dev C++ versucht.
    Das ganze habe ich mit folgendem Code probiert.

    CURL *curl;
    CURLcode res;
    curl = curl_easy_init();
    //Nachfolgender Code ist für das 1. Problem nicht wichtig
    curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
    string buffer;
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&buffer);
    
    size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp)
    { 
      fstream f;
      f.open("test.html", ios_base::out);
      f << (char *)buffer;
      f.close();
    }
    

    An sich sollte das ja keine große Sache sein. Ich hab mir alles geladen, was ich brauche und dann einfach mal losgelegt.
    Nun hab ich aber folgende Probleme.
    Unter MSVC kommt im Debugger bei curl_easy_init() eine Fehlermeldung

    Unbehandelte Ausnahme bei 0x00026810 in facebook.exe: 0xC0000005: Access violation.

    Hab schon ne Menge gegoogelt aber leider nichts gefunden.

    Dann hab ich das ganze mit Dev C++ gemacht.
    Hat auf den ersten Blick wunderbar funktioniert. Allerdings durfte ich nach einigen Tests feststellen, dass mein Programm die Dateien nicht immer vollständig runterlädt. Die dateien hören mittendrin auf.

    Ein test mit Wireshark zeigte mir, dass alle Datensegmente gesendet wurden. Es fehlt also nichts. Kennt jemand dieses Problem? Ich finde es sehr merkwürdig. Die dateien sind auch bei jedem download unterschiedlich groß. mal lädt er ein paar bytes mehr, mal weniger. Dazu zu sagen ist vielleicht, dass es sich hier nur um ein paar kb-große html dateien handelt.

    Mit freundlichen Grüßen,
    Markus

    edit: ups, hab mich im forum verlesen. sollte gar nicht hier rein.

    edit2: ich kann ja noch hinzufügen. login mit post, cookies verwalten etc. funktioniert schon. nur das runterladen hapert noch. das ist nun aber sehr wichtig, da ich sonst das ganze projekt in die tonne kloppen kann.



  • Dieser Thread wurde von Moderator/in phlox81 aus dem Forum Andere GUIs - Qt, GTK+, wxWidgets in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • string buffer;
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&buffer);
    

    Wozu der string ?

    size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp)
    { 
      fstream f;
      f.open("test.html", ios_base::out);
      f << (char *)buffer;
      f.close();
    }
    

    Bist du sicher, dass cURL buffer mit 0 terminiert?
    Wahrscheinlich wird dieser Callback mehrmals aufgerufen und jedes Mal die Datei überschrieben.



  • Der String ist ein Überbleibsel, weil ich das ein paar mal überarbeitet hab. Ich fand ein paar Sachen, die ich dann ausprobiert habe und das hat sich dann alles so ergeben.

    Wahrscheinlich wird dieser Callback mehrmals aufgerufen und jedes Mal die Datei überschrieben.

    oh gott ich bin so blöd. Hab gerade gemerkt, dass der die Segmente andersrum zusammensetzt. Da ich bei jeder Datei den Anfang gesehen hab, dachte ich mir, der hört einfach mittendrin auf. Deswegen hab ich es mit io_base::app gar nicht erst versucht. Jetzt macht das auch sinn, warum das programm immer unterschiedlich viel runterlädt.
    Vielen Dank, dann wär das problem schonmal gelöst. Das Zusammensetzen krieg ich schon hin.
    
    So, wenn mir dann noch jemand beim Problem mit MSVC helfen würde. Ist jetzt aber nicht so wichtig für mich.
    
    Nochmal Danke für den kleinen Denkanstoß.
    

    EDIT: mist, Denkfehler. Die datei war nur so groß, weil die neuen Dateien drangehängt hab. Da fehlt immernoch der ganze rest.

    noch ein EDIT:
    hab nochmal nach einer anderen möglichkeit zum schreiben gesucht. War ja irgendwie klar, dass es daran liegt. Bin auf das hier gestoßen.
    http://stackoverflow.com/questions/1636333/download-file-using-libcurl-in-c-c
    Klappt jetzt wunderbar.


Anmelden zum Antworten