Marko Bencun: HTTP-Request

Hallo,

Ich bin gerade dabei, eine Winsock Klasse zu schreiben. Habe gerade den Server abgeschlossen, und teste ihn gerade als Webserver. Doch hier das Problem: Meine Klasse versucht solange zu empfangen, bis man beim Browser auf "Abbrechen" klickt, dann erst kommen die Daten an. Wie weiss ich, wann der Browser fertig gesendet hat und ich die Daten auswerten kann? Ist das Webclient-spezifisch? Denn wenn ich mit nem eigenen Clienten zum Server Daten schicke, klappt alles. Ich könnte mir vorstellen, das Webbrowser vom Server erwarten, selber die Verbindung abbzubrechen, wenn er z.B zwei Zeilenumbrüche bekommen hat oder so. Wie läuft das also?

Grüße, Marko Bencun

  1. Hallo Marko,

    Wie weiss ich, wann der Browser fertig gesendet hat und ich die Daten auswerten kann?

    Lies Dir am besten mal den HTTP-Standard durch: http://www.w3.org/Protocols/rfc2616/rfc2616.html Dort sollten alle Deine Fragen geklärt werden.

    Viele Grüße,
    Christian

  2. Hi,

    Wie weiss ich, wann der Browser fertig gesendet hat und ich die Daten auswerten kann?

    der Browser ist dann fertig, wenn Deine Auswertung ergeben hat, dass Du mit den bereits gesendeten Daten zufrieden bist.

    Denn wenn ich mit nem eigenen Clienten zum Server Daten schicke, klappt alles.

    Mach mal einen Test: Nimm 'nen Telnet-Client, und sende eine Handvoll Requests an irgendeinen Server. Erzeuge GET- und POST-Requests, und schaue, wann der Server die Antwort sendet. Tipp: Versuche POST-Requests mit und ohne Content-Length-Header.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  3. Halihallo Marko

    Ich bin gerade dabei, eine Winsock Klasse zu schreiben. Habe gerade den Server abgeschlossen, und teste ihn gerade als Webserver. Doch hier das Problem: Meine Klasse versucht solange zu empfangen, bis man beim Browser auf "Abbrechen" klickt, dann erst kommen die Daten an. Wie weiss ich, wann der Browser fertig gesendet hat und ich die Daten auswerten kann?

    Der Browser sendet den Request-Header, dieser wird vom Content (bei POST-Methode) durch
    zwei CRLF (\015\012\015\012, Oktal) getrennt. Wenn nun der Browser keinen Body sendet,
    ist nach zwei CRLF in unmittelbarer Folge fertig. Sendet der Browser jedoch Content
    mit wirst du im Header ein Feld namens "Content-Length" wiederfinden, welches angibt,
    wieviele Bytes nach den zwei CRLF noch kommen und erst dann ist Schluss.

    So kannst du feststellen, wann der Request beendet ist; und dann folgt deine Response.

    Aber Achtung bei HTTP1.1: Connection: keep-alive hält die Verbindung auch nach der
    Response offen und es folgen weitere Requests. Wenn du diesen Standard nicht unterstützt,
    solltest du es dem Client über den Response-Header "Connection: close" mitteilen.

    Ist das Webclient-spezifisch?

    um himmelswillen nein, das wäre für das INet tödlich.

    Alles und vieles mehr stehen natürlich in den Standards zu HTTP :-)

    Viele Grüsse

    Philipp

    --
    RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
    Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
  4. Hi,

    Danke für die Anworten. Der Fehler an einem dummen logischen Fehler in der Schleife :/ Der Browser Request endet von selbst, ich muss nicht zwei Leerzeilen sucne o.Ä:

    Dim bytes As Integer = sckConnection.Receive(recb, recb.Length, SocketFlags.None)
                            inp &= System.Text.Encoding.Default.GetString(recb, 0, bytes)
                            Do While bytes > 0 And >>>>>>>recb.Length - bytes = 0<<<<<<<<< hier war der Fehler ;)
                                bytes = sckConnection.Receive(recb, recb.Length, SocketFlags.None)
                                inp &= System.Text.Encoding.Default.GetString(recb, 0, bytes)
                            Loop

    Grüße, Marko Bencun