Sockets und das HTTP-Protokoll



  • 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?



  • Was für ein eingescanntes schrieb:

    Tim schrieb:

    Das eingescannte Bild ist einfach nur cool 🕶 👍

    Was für ein eingescanntes Bild?

    Das, das ersetzt wurde.



  • Hallo miteinander, 😃

    ich hab mich jetzt in dieses Tutorial reingearbeitet. Leider liefert mein IIS folgenden Response zurück:

    HTTP/1.1 100 Continue
    
    Server: Microsoft-IIS/5.1
    
    Date: Wed, 26 Mar 2008 17:29:40 GMT
    
    HTTP/1.1 200 OK
    
    Server: Microsoft-IIS/5.1
    
    Date: Wed, 26 Mar 2008 17:29:40 GMT
    
    Connection: close
    
    X-Powered-By: ServletExec/5.0p06, Servlet/2.4, JSP/2.0
    
    Content-Type: text/html; charset=UTF-8
    
    Cache-Control: no-cache
    
    Set-Cookie: JSESSIONID=2ZeunHRcvNeHrcmBfYa9cw1yilk; path=/arsys
    

    Aufgrund dessen läuft die GetLine Funktion in eine Endlosschleife -> Absturz. Probiere jetzt schon seit Tagen herum. Ich versuche dieses Tutorial auf alle Webserver (Apache,Tomcat,IIS) zum laufen zu bekommen.

    Danke für eure Hilfe! 🤡



  • Hallo 😃

    monoid schrieb:

    Hallo miteinander, 😃

    ich hab mich jetzt in dieses Tutorial reingearbeitet. Leider liefert mein IIS folgenden Response zurück:

    HTTP/1.1 100 Continue
    
    Server: Microsoft-IIS/5.1
    
    Date: Wed, 26 Mar 2008 17:29:40 GMT
    
    HTTP/1.1 200 OK
    
    Server: Microsoft-IIS/5.1
    
    Date: Wed, 26 Mar 2008 17:29:40 GMT
    
    Connection: close
    
    X-Powered-By: ServletExec/5.0p06, Servlet/2.4, JSP/2.0
    
    Content-Type: text/html; charset=UTF-8
    
    Cache-Control: no-cache
    
    Set-Cookie: JSESSIONID=2ZeunHRcvNeHrcmBfYa9cw1yilk; path=/arsys
    

    Aufgrund dessen läuft die GetLine Funktion in eine Endlosschleife -> Absturz.

    Aufgrund von was?
    Könntest du mir die URL (d)eines IIS-Servers geben, dann kann ich das selber ausprobieren.



  • So! Hallo mal wieder!

    Nach Monaten Abwesenheit bin ich auch mal wieder da 🙂 und natürlich brauche ich mal wieder Eure Hilfe.

    Wie im Thread schon mal erwähnt, habe ich einen Teil dieses Samples erfolgreich in meinem Programm verbaut, das schöne ist halt, dass das alles ohne weitere Libs, .NET oder sonst was läuft.
    Jetzt habe ich einen Umbau vor und müßte dazu einen Post-Request erzeugen. Da ich hier nur Get-Beispiele finde und aus der W3-Protokoll-Doku nicht gänzlich schlau werde, frage ich hier mal nach.
    Vielleicht hat ja jmd. die notwendigen zusätzlichen Zeilen, die Grundform sollte ja die selbe sein.

    THX!





  • SammyRukka schrieb:

    ...und aus der W3-Protokoll-Doku nicht gänzlich schlau werde,...

    ...und Du meinst, mit dem Link wird's besser... :p hast Du ein Vertrauen!

    Aber OK, ich werd's mal durchforsten und hoffen, dass ich daraus sinnvollen Code gießen kann. thx so far



  • SammyRukka schrieb:

    ...und Du meinst, mit dem Link wird's besser... :p hast Du ein Vertrauen!

    die seite gibts schon ziemlich lange. ich hab' damals 'nen kleinen webserver gecodet und hatte 0 ahnung von http. ich hab' fast alles, was man dafür wissen muss von dieser seite.
    btw, hier ist ein einfaches beispiel u.a. mit POST request: http://dev.makingthings.com/browser/firmware/trunk/controller/makingthings/webclient.c
    🙂



  • Na das ist doch mal etwas Greifbares. Danke! Ich schau mal.





  • Hi bei mir wird das Programm immer mit "Verbindung fehlgeschlagen!" beendet. Kann es daran iegen das indem Netzwerk wo ich bin alle browser nur mit einem Proxy laufen?
    Wie kann man das beheben?



  • Ja das könnte daran liegen. Ich aber leider keine Ahnung, wie man das beheben kann. Am besten eröffne mal einen Thread im Linux- oder WinAPI-Forum.



  • Ich habe gerade ein Programm geschrieben, das eine Webseite herunterlädt. Wenn ich HTTP/1.0 nutze, dann klappt alles, aber nutze ich HTTP/1.1, dannn werden am Ende und Anfang noch einige Dinge mitgesendet, die da nicht hingehören, denke ich. Ich bin übrigens nicht nach Content-Length gegangen, sondern habe gewartet bis der Server trennt(Connection: Close)...

    Hier die Ausgabe:

    'HTTP/1.1 200 OK
    '
    'Date: Sat, 08 Nov 2008 18:33:37 GMT
    '
    'Server: Apache/2.2.3 (Debian) PHP/4.4.4-8+etch6
    '
    'X-Powered-By: PHP/4.4.4-8+etch6
    '
    'Set-Cookie: POSTNUKESID=40a9782024010d53f011b6e64fc72f17; expires=Wed, 09 Nov 2033 00:33:37 GMT; path=/cms
    '
    'Expires: Thu, 19 Nov 1981 08:52:00 GMT
    '
    'Cache-Control: cache
    '
    'Pragma: no-cache
    '
    'Connection: close
    '
    'Transfer-Encoding: chunked
    '
    'Content-Type: text/html
    '
    '
    '
    '47b2
    '
    '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">'
    '<html>'
    '<head>'
    '<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">'
    '<title>c++.de :: Irgendwer hat immer eine Antwort</title>'
    '<meta name="KEYWORDS" content="C++, Software, C, C#, STL, OOP, OOA, Objektorientierte Programmierung, Softwareentwicklung, Tutorials, Compiler, Bücher, ebooks, IDE, Programmierung, Proggen, c++.de, Decompiler, Visual, MFC, VCL, main, if, while, else, for, Objekt, .NET, net, gtkmm, qt, wxWidgets, GUI, Dialog, Fenster, Anwendung">'
    '<meta name="DESCRIPTION" content="Irgendwer hat immer eine Antwort">'
    '<meta name="ROBOTS" content="INDEX,FOLLOW">'
    '<meta name="resource-type" content="document">'
    [usw......]
    'pageTracker._trackPageview();'
    '</script></body>'
    '</html>
    '
    '0
    '
    '
    '

    Warum? Die ' sind nur zum besseren Debugen und im Original nicht vorhanden. Habt ihr das Problem bei http://www.c-plusplus.net auch oder ist mein Programm fehlerhaft? Aber warum geht es dann perfekt(!) mit HTTP/1.0 aber mit HTTP/1.1 nicht?

    Danke für die Hilfe,
    VerzweifelterMensch


Anmelden zum Antworten