Sockets und das HTTP-Protokoll



  • SammyRukka schrieb:

    Was würd' ich bloß ohne Euch machen?!?! :p - vermutlich Java 😃

    mal ganz nebenbei: in Java hättest du mit sowas nicht das geringste problem 👍



  • SammyRukka schrieb:

    Wenn ich bsw. einen EBay-Artikel damit auslese, dann werden einige Zeichen, die eigentlich Leerzeichen sein sollten (oder vom Browser zumindest als solche ausgegeben werden) als 'á' dargestellt (und Umlaute halt ganz anders).

    Wo dargestellt, in der Windows-Konsole?



  • pale dog schrieb:

    mal ganz nebenbei: in Java hättest du mit sowas nicht das geringste problem 👍

    In Java hätte ich mit so vielem kein Problem und wäre vor allem vieeeel schneller!

    joomoo schrieb:

    Wo dargestellt, in der Windows-Konsole?

    Ja, noch ja. Im meine aber, dass ich auch beim Schrieben in eine Datei das Problem hatte. Ausserdem kann ich mit den geparsten Werten deshalb auch nicht rechnen, ist also kein reines Anzeigeproblem...



  • SammyRukka schrieb:

    joomoo schrieb:

    Wo dargestellt, in der Windows-Konsole?

    Ja, noch ja. Im meine aber, dass ich auch beim Schrieben in eine Datei das Problem hatte. Ausserdem kann ich mit den geparsten Werten deshalb auch nicht rechnen, ist also kein reines Anzeigeproblem...

    Wenn es auch in Dateien auftritt, dann ist ist es ein anderes Problem. Um welche Seite/URL handelt es sich denn?



  • Nimm einfach eine Ebay-Seite. vor und nach dem Betrag des Gebots sollten Leerzeichen sein.
    Warum ist es ein anderes Problem? Wenn ich schon falsch zum Verarbeiten einlese, dann muss das Schreiben doch auch falsch laufen!?



  • SammyRukka schrieb:

    Nimm einfach eine Ebay-Seite. vor und nach dem Betrag des Gebots sollten Leerzeichen sein.

    Bei mir klappt das, vielleicht liegt's an deinem Editor?



  • Hmmm. Blöd, wenn man so etwas über wochen verteilt. Die temporär heruntergeladene Datei wird im Editor korrekt angezeigt (notepad).
    Dann klappt wohl das Einlesen der Datei nicht:

    fin.open( dateiname.c_str(), ios_base::in );
    if( fin ) {
    	char c;
    	while( !fin.eof() ) {
    		fin.get( c );
    		htmlContent += c;
    	}
    fin.close();
    

    Denkfehler? Also Pros, zeigt was ihr drauf habt :p und sry, dass ich den Tutorial-Code in Verdacht hatte 🤡

    ---EDIT---

    Ich komme da nicht weiter:
    Annahme: Wenn meine HTML 'iso-8859-1' ist (und das ist sie!), dann benutzt sie doch auch nur 7/8 Bit für ein Zeichen und die ersten x (weiss nicht genau) sind mit dem Windows-1252 gleich.
    Frage: Warum kann dann aus einem Simplen Space ein 'á' werden.
    Und dann noch eine Frage:
    Wenn ich den Tutorial-Code benutze, so wie er ist, und eine Datei herunterlade und speichere, dann wird das Encoding doch gar nicht ausgewertet, unter Umständen stimmt stimmt 'iso-8859-1' also gar nicht mehr, wenn ich bsw. beim Herunterladen mit einer anderen Codepage arbeite und bewusst keine Konvertierung vornehme. Oder was?! 😕

    Ich komme da nicht weiter.
    Ausserdem frage ich mich, ob ich damit nicht einen eigenen Thread aufmachen sollte. 🙂

    --EDIT2--
    Ich habe mal einen neuen Thread gestartet:
    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1308613.html#1308613!



  • Hallo Leute,

    ich habe mir das fertige Programm runtergeladen und das funktioniert auch wunderbar.

    Allerdings habe ich ein Problem wenn ich die Seite anstatt in einer Datei zu speichern in einem std::string speichern möchte um dann damit weiter zu arbeiten.

    Wenn ich überall da wo in die Datei geschrieben wird die Variable "buf" einem String zuweise bekomme ich einen zerstückelten Inhalt.

    Also da wiederholt sich der Inhalt manchmal und es ist nicht alles an der Position wo es sein sollte.

    Kann mir vielleicht jemand einen Tipp geben wie ich am besten das Programm abändern kann damit der Inhalt nicht in eine Datei sondern in einem string gespeichert wird der dann am Schluß den kompletten Inhalt der Webseite hat.

    Ich wäre für jeden Tipp sehr dankbar.

    Aber sonst ist es ein perfektes Tutorial. Vielen Dank.

    nixchecker



  • Du solltest einen StringBuffer benutzen und ganz am Ende erst einen String draus machen. Ich glaube, dass ich das so gamacht habe (Sourcen sind tief in einer VM vergraben).



  • Ok das heißt also das ich an den stellen wo mit fout.write(...) in die Datei geschrieben wird stattdessen in einem StringBuffer schreiben und dann am schluß aus dem StringBuffer einen String daraus machen?

    nixchecker



  • Ja, das meinte ich, aber.....

    nee, das nehme ich mal zurück.
    Habe Codeschnipsel gefunden. Ich mache das so:

    std::string meinString = "";
    meinString append(buf, bytesRecv);

    Genaugenommen arbeite ich auf der Referenz eines übergebenen Strings.

    Damit sollte das klappen.

    Ansonsten sollte Dir klar sein, dass ein cout in der Console unter Umständen für einige Zeichen Schotter ausgibt, da bin ich auch mal drauf reingefallen....



  • Hi,

    ja ist mir bekannt mit dem cout.

    Aber so scheint es zu funktionieren. An "append" hab ich gar nicht gedacht.

    Vielen Dank für die Hilfe.

    nixchecker



  • nixchecker schrieb:

    Vielen Dank für die Hilfe.

    Schön, dass auch ich mal helfen konnte 😉



  • Danke fürs Tutorial. Ich hab mir den Code runtergeladen mit der gekapselten recv Funktion. Damit hab ich mir einen kleinen Webseitendownloader geschrieben.

    Diese Funktion hier hat mich eine Weile beschäftigt:

    //Chunk complete
    for(int i = 0; i < 2; ++i)
    {
     char temp;
     Recv(Socket, &temp, 1, 0);
    }
    

    Die soll doch dafür sorgen daß die letzten zwei Bytes ignoriert werden, nur warum landen die im GlobalBuffer? Diese letzten zwei Bytes sollte man vielleicht noch ordnungsgemäß entsorgen.

    Das Problem war, daß nach dem laden des letzten Chunks der Website die Schleife ja mit der If Bedingung chunkSize <= 0 mit einem Break abgebrochen wird. Dann stand aber nochwas in dem GlobalBuffer - den man ja nicht nachmachen soll. Nämlich ein Zeilenumbruch - die nicht entsorgten zwei Bytes. Als folge davon konnte der Header der folgenden URL nicht mehr ausgewertet werden und der Download lief eine gewisse Zeit Amok.

    cout << "Downloading... (Chunked)" << endl;
    while(true)
       {
        stringstream sstream;
        GetLine(Socket, sstream);
        int chunkSize = -1;
    
        // Größe des nächsten Parts einlesen
        sstream >> hex >> chunkSize; 
    
        if(chunkSize <= 0)
          {
           break;
          }
    

    Das hat mich eine ganze Weile beschäftigt.



  • TheRave schrieb:

    Danke fürs Tutorial. Ich hab mir den Code runtergeladen mit der gekapselten recv Funktion. Damit hab ich mir einen kleinen Webseitendownloader geschrieben.

    Diese Funktion hier hat mich eine Weile beschäftigt:

    //Chunk complete
    for(int i = 0; i < 2; ++i)
    {
     char temp;
     Recv(Socket, &temp, 1, 0);
    }
    

    Die soll doch dafür sorgen daß die letzten zwei Bytes ignoriert werden, nur warum landen die im GlobalBuffer? Diese letzten zwei Bytes sollte man vielleicht noch ordnungsgemäß entsorgen.

    Das Problem war, daß nach dem laden des letzten Chunks der Website die Schleife ja mit der If Bedingung chunkSize <= 0 mit einem Break abgebrochen wird. Dann stand aber nochwas in dem GlobalBuffer - den man ja nicht nachmachen soll. Nämlich ein Zeilenumbruch - die nicht entsorgten zwei Bytes. Als folge davon konnte der Header der folgenden URL nicht mehr ausgewertet werden und der Download lief eine gewisse Zeit Amok.

    cout << "Downloading... (Chunked)" << endl;
    while(true)
       {
        stringstream sstream;
        GetLine(Socket, sstream);
        int chunkSize = -1;
                        
        // Größe des nächsten Parts einlesen
        sstream >> hex >> chunkSize; 
                        
        if(chunkSize <= 0)
          {
           break;
          }
    

    Das hat mich eine ganze Weile beschäftigt.

    Tatsächlich. Das tut mir leid, vielen Dank dass du mir das sagst. Ich hatte einfach FInd & Replace gemacht um alle recv Funktion zu ersetzen.

    Werde das gleich mal korrigieren und hochladen.



  • Ist ja kein Problem. Der Fall tritt ja auch nur ein, wenn man mehrere URLs hintereinander lädt.



  • Wie schafft man es, das ganze so um zu schreiben, das man damit mehrer Seiten hintereinadner herutnerladen kann?

    Ich habs schon mehrfach probiert, zB. das ganze in eine Funktion ausgelagert und diese mehrfach aufgerufen oder Schleifen an verschiedene Stelle gesetzt, doch leider kahm bei jeder 2. Verbindung der folgende Fehler:
    http://img212.imageshack.us/img212/3702/errorerfolgreichsm9.jpg

    Ich hab den Quellcode hier nicht gepostet, da der Fehler bei vielen Verschieden versuchen kahm und ich dachte ich hab vlt. nur irgendwas dummes übersehen...

    Das simpelste war das komplette (Bis auf eingabe der URL) in eine Funktion zu packen und diese zweimal aufzurufen.

    Jemand eine Idee was ich falsch mache? 😞

    //edit: Windows Vista, Code::Blocks und MinGW



  • Hi,
    Ich habe noch ne kleine Frage zu den HTTP Sachen.
    Wie kann ich nen request hinschicken mit nem username und nem passwort?
    Also z.B. solche urls http://username:passwort@domain.com ?
    Hoffe das die Frage nochnicht gestellt wurde (habe nicht alle Seiten durchgeblättert).

    Schönes Wochenende!
    MFG ReduX





  • Tim schrieb:

    Das eingescannte Bild ist einfach nur cool 🕶 👍

    Was für ein eingescanntes Bild?


Anmelden zum Antworten