Webseite in string speichern



  • Hallo,

    ich hab ein kleines Problem.... Ich hab ein kleines Programm geschrieben fuer die Philips Hue Bridge.

    Es wird eine Verbindung auf die Bridge hergestellt und es wird eine Webseite aufgerufen ueber:
    "system("usr/lib/mozilla 172.35.96.4/desrciption.xml")

    Das funktioniert soweit gut.
    Meine Frage ist jetzt.

    Wie kann ich den Quelltext bzw. der angezeigte XML code runtergeladen werden. Diese wollte ich dann in einen String speichern, um die einzelnen tags auf bestimmte Woerter zu durchsuchen.

    Vielen Dank schonmal

    MFG

    silver



  • Am einfachsten geht das mit einer Library, welche die HTTP Anfragen für dich erledigt. Eine große Library die so ziemlich alles kann ist libcurl. Ist zwar eine C Library, gibt aber C++ Bindings und wenn man nichts spezielles will ist die C API auch gar nicht so schlimm.



  • Dieses Beispiel hier müsste sich einfach anpassen lassen, sodass die Daten in einen std::string geladen werden.



  • Hallo,

    vielen Dank fuer deinen Link... ich habe mir den angeschaut und auch uebernommen.. aber der Compiler hat am anfang immer gemeckert wegen dem Malloc und dem Realloc... aber das konnte ich beheben. Jetzt meinte mann zu mir, ich solle das ganze doch mit festen Array speicheradressen programmieren, weil das Programm spaeter auf einen Microcontroller gespielt wird und der diese dynamischen speicherverwaltungen nicht verarbeiten kann.

    Ich versuche diese 2 Zeilen codes schon umzuschreiben... aber das wird echt heftig, weil ich noch nicht so viel programmiererfahrung habe.

    Gaebe es denn noch eine Alternative, wie ich das mit der Webseite realisieren koennte?? ansonsten... versuche ich wie gesagt, die Zeilen umzuschrieben.

    Aber vielen Dank nochmal

    MFG Silver



  • Dynamische Speicherverwaltung wäre in dem Fall aber deutlich besser. Es sei denn, du weißt wie groß die Website sein wird, dann kannst du auch einen dementsprechend großen Array verwenden.

    Zum Beispiel so (ungetestet):

    [...]
    #define MAX_WEBSITE_SIZE      65536
    
    struct MemoryStruct {
      char memory[MAX_WEBSITE_SIZE];
      int currentPosition;
    };
    
    static size_t
    WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
    {
      size_t realsize = size * nmemb;
      struct MemoryStruct *mem = (struct MemoryStruct *)userp;
    
      /* + 1 to have enough space for a terminating '\0' */ 
      if ((mem->currentPosition + realsize + 1) >= MAX_WEBSITE_SIZE)
        /* out of memory! */ 
        printf("not enough memory (MAX_WEBSITE_SIZE too small)\n");
    
        /* but write as much data as possible into mem->memory */
        /* recalculate realsize (realsize = current free space of mem->memory) */
        realsize = MAX_WEBSITE_SIZE - mem->currentPosition - 1;
      }
    
      memcpy(&(mem->memory[mem->currentPosition]), contents, realsize);
      mem->currentPosition += realsize;
      mem->memory[mem->size] = 0;
    
      return realsize;
    }
    
    int main(void)
    {
      CURL *curl_handle;
      CURLcode res;
    
      struct MemoryStruct chunk;
      /* fill up memory with '\0' */
      memset (chunk.memory, 0, MAX_WEBSITE_SIZE);
      chunk.currentPosition = 0;
    
      curl_global_init(CURL_GLOBAL_ALL);
    
    [...]
    
      /* cleanup curl stuff */ 
      curl_easy_cleanup(curl_handle);
    
      /* we're done with libcurl, so clean it up */ 
      curl_global_cleanup();
    
      return 0;
    }
    

    An den ausgelassenen Stellen im Code hat sich nichts verändert (also kopier es einfach wieder rein was fehlt)



  • Wenn dein System kein malloc kann, kannst du das getrost vergessen, dann kannst du auch keine Bibliothek wie libcurl verwenden und musst die HTTP-Anfrage selbst absetzen (ist aber auch kein großes Ding).



  • Fehlerkorrektur: In WriteMemoryCallback bitte die letzte Zeile vor return realsize; streichen (also mem->memory[mem->size] = 0; ).



  • GiraffeTurboSetzen schrieb:

    Wenn dein System kein malloc kann

    Ups, glatt überlesen, dass überhaupt keine dynamische Speicherverwaltung möglich ist.



  • Wenn das System keine dynamische Speicherverwaltung kann, dann wird sowieso überhaupt alles schwierig bis unmöglich worum es hier geht.

    Ich glaube aber dass hier mit Schnüren festgemachte Bären im Spiel sind. Fragt sich nur wer wem.



  • weil das Programm spaeter auf einen Microcontroller gespielt wird und der diese dynamischen speicherverwaltungen nicht verarbeiten kann.

    jetzt aber mal die Hosen runter:

    -welcher Microcontroller (Hersteller, usw.)?
    -welcher Kompiler? wohl er C als C++ oder?

    weil wenn das alles nachher in einem Mini-System laufen muss bringen dir die ganzen Tips nichts - und ohne dynamische Speicherverwaltung und wenig Power kann das zu einer völlig anderen Lösung führen - also erklär mal dein System



  • hustbaer schrieb:

    Ich glaube aber dass hier mit Schnüren festgemachte Bären im Spiel sind. Fragt sich nur wer wem.

    Es wäre interessant zu wissen, wie der (und vorallem welcher) Compiler den Speicher verwendet. Es gibt zwar Festwert-, dynamische und statische Speicherzellen, aber mit der richtigen Steuerlogik lassen sich zumindest die letzteren ähnlich verwenden (Steuerlogik ist bei dynamischen Speicherzellen aufwendiger). Zwar nutzen normale Arbeitsspeicher fast nur dynamische Speicherzellen (weil wesentlich billiger in der Fertigung), jedoch sind bei Mikrocontrollern häufig statische Speicherzellen (oder noch Festwertspeicher) verbaut, da statische Speicherzellen wesentlich schnellere Zugriffszeiten erlauben und sich nicht wie dynamische Speicherzellen (eigentlich nur bestehend aus vielen Kondensatoren mit Transistoren) nach wenigen Millisekunden entladen bzw. nur einmal ausgelesen werden können (weil danach entladen).



  • Was hat jetzt der Unterschied zwischen DRAM und SRAM mit dem Problem des TO zu tun?



  • Nix.
    Er meinte vermutlich mir damit einen Bären aufbinden zu können.
    Ist wohl ein ganz ein lustiger.


  • Mod

    hustbaer schrieb:

    te vermutlich mit damit einen Bären aufbinden zu können.

    Ist es falsch, dass ich mir dich so vorstelle?



  • Falsch im Sinne von Moral oder von Übereinstimmung mit der Realität?


  • Mod

    hustbaer schrieb:

    Falsch im Sinne von Moral oder von Übereinstimmung mit der Realität?

    Ich bekomme einfach nicht diese Bilder aus meinem Kopf, e.g. ein Bär mit einer Lesebrille sitzt irgendwo in einem Wald mit seinem Laptop auf einem Baumstumpf und surft im Forum rum. Er schaut auf meinen Beitrag, schürzt seine Lippen und streichelt seinen Bart.

    Ähnliche Vorstellungen bekomme ich bei Volkard, nur ist der Bär in dem Fall ein Schwarzbär - du bist braun.

    Vielleicht liegt es daran, dass ich versuche die Personen hier zu visualisieren, dich aber noch nie gesehen hab'? 😃





  • Also Übereinstimmung mit der Realität gibt's nicht viel.
    Hab mit nem Bär nicht sehr viel gemein. Auch keine Lesebrille, bloss manchmal ne Sonnenbrille. Aber dann auch keine wie in deinem Bild (Wayfarer-Style) sondern ne RB3212 bzw. ne Vintage C Wire.
    Die Wayfarer passt mir leider gar nicht.
    Im Wald sitz' ich auch nicht, und mein Notebook kommt sehr selten zum Einsatz.

    Ich hab' aber nix dagegen wenn das das Bild in deinem Kopf ist. Bären sind cool. Zumindest so lange sie cool bleiben und nicht böse werden 😃



  • Hallo...

    entschuldigt bitte meine verspaetete Antwort...

    hab es auf ne andere art und weise versucht.... hab dazu auch nen guten quellcode gefunden... jdeoch hab ich das Problem, dass er einen teil der library nicht findet.

    <curl/types.h>

    ich bekomm dann die Fehelermeldung>
    "Unresolved inclusion" und""No such file or directory""

    haette da jemand vllt nen Tip wie ich diesen Fehler beheben kann??

    MFG
    silver


  • Mod

    silverstone1986 schrieb:

    haette da jemand vllt nen Tip wie ich diesen Fehler beheben kann??

    Welche andere Antwort als "Du musst die Bibliothek korrekt installieren" erwartest du bei dem Übermaß an Informationen, mit dem du uns beglückt hast?


Log in to reply