[HTTP, TCP, C++]: POST Request als TCP-Fragment?



  • Hallo zusammen.
    Leider hab ich kein passendes Unterforum gefunden und da auch die Suche nix ergeben hat, versuch ich's mal. Vllt kann mir ein Mod weiterhelfen wo es denn am besten hingehört. 😉

    Grob: es geht um einen webservice in einem selbst gebauten Server bzw. lieber 'Applikation'. Der nimmt HTTP POST Requests entgegen, verarbeitet den Inhalt, baut und verschickt die entsprechende Response.

    Lokal auf dem Rechner läuft alles ohne Probleme. Request kommt, Inhalt verarbeitet, Antwort gebaut und verschickt. Im LAN auch alles ohne Probleme. Mit div. Webbrowsern überrpüft ob die Applikation abstürtzt, mit einem kleinen, eigens gebautem Tool verschiedene Inhalte getestet und für gut befunden.

    Mit einem externen Tool von einem Bekannten schmiert mir die App aber immer gnadenlos ab wenn ich vom lokalen Rechner weg ins LAN geh. Wobei das Tool einem Mini-Browser entspricht, der nur per HTTP Get/Post schaut was von der jeweiligen Seite zurückkommt. Das klappt im web auf jeder Seite auch prima, nur nicht mit meiner Applikation.

    Der Grund war schnell gefunden: bei einem HTTP POST Request wird an meine App zuerst ein TCP-Fragment geschickt welches das 'POST' (ohne CR/LF) enthält und anschliessend, in einem zweiten Paket den Rest vom HTTP Header. Eigentlich denkt man jetz: Ok, der macht mit dem Tool was nicht ganz regelkonformes. Also Fehler bei ihm. Aber: wie kann es dann sein, dass das Tool ohne Probleme auf webseiten klappt? Da scheint der HTTP Server das Fragment ohne Probleme zu verarbeiten.

    Daher meine Frage:
    Ist es jetzt einen TCP/IP Sache, die die komplette HTTP-Anfrage immer fragmentiert und später wieder zusammensetzt wird? Hab im HTTP/1.0 RFC1945 und HTTP/1.1 RFC2616 nichts dergleichen gefunden, daher die Vermutung, das es auf Transport Ebene passiert. Oder vllt doch eine seltsame Art und Weise wie das externe Tool die Daten rauschickt?

    Hoffe das mein Problem irgendwie klar geworden ist und jemand Licht ins Dunkel bringen kann.

    m.

    Ach ja, es ist C++ mit VC6.0 und die komplette Kommunikation läuft über WSA u IOCompletionPorts. Aber die steht schon längst und ist auch schon längst ohne Probleme produktiv. Deswegen bin ich überhaupt hier 😉





  • Hi,
    Ob zuerst 1 Byte und dann 1200 Bytes gesendet werden darf für dein App. keine Rolle spielen.
    TCP/IP ist stream orientiert und es ist daher unbekannt ob noch mehr bzw. wie viel noch kommt. Das ist rein inhaltlich festgelegt (hier z.B. durch das HTTP Protokoll).
    Gruss Simon



  • Danke schonmal für die Anworte. Va die erste.

    Vom Prinzip her ist mir das auch alles klar. Was mich wundert, ist das ausgerechnet immer nach der HTTP Methode der Header fragmentiert wird. Sind einfach nur um die 5 Bytes die fragmentiert werden. Genau dieser Umstand kommt mir seltsam vor. Geht mit einem Webbrowser auf meine App, LAN oder über WAN, dann hab ich wenigstens die erste HTTP Header Zeile mit CR/LF terminiert.

    m.



  • Das mag Dir seltsam vorkommen, darf aber der Funktion Deiner Anwendung keinen Abbruch tun. Der HTTP-Request ist vorbei, nachdem Du den Header und ggfs. den Body (beide Abgeschlossen durch je eine Leerzeile) des Request gelesen hast. Ob die Daten bis zum Ende des Request zeichenweise, blockweise oder in Tüten (:D) kommen, ist egal.

    Du solltest am besten den Header komplett lesen, dann anhand des Headers entscheiden, ob ihm noch ein Body folgt, dann (ggfs.) den Body komplett lesen, und dann erst die gesamte Anfrage auswerten.



  • LordJaxom schrieb:

    Der HTTP-Request ist vorbei, nachdem Du den Header und ggfs. den Body (beide Abgeschlossen durch je eine Leerzeile) des Request gelesen hast.

    Entschuldige, daß ich so kleinlich bin aber der Body wird nicht durch eine Leerzeile abgeschlossen.



  • Ich seh schon, da beiss ich bei euch auf Granit. 😉

    Nein, im Ernst. Es kommt mir einfach seltsam vor, dass es IMMER nach der HTTP method fragmentiert wird. Aber scheint normal zu sein. Hab es jetz behoben (wenn's mal ein bisschen länger dauert, einfach nochmal WSAReceive (...) rufen 🙂 )

    Danke aber für die Anregungen zum nachdenken!

    m.

    PS: Unregistriert blöd daher reden (egal ob richtig od falsch) is einfach arm.



  • PS: Unregistriert blöd daher reden (egal ob richtig od falsch) is einfach arm.

    Ja ne is klar...



  • Naja, blöd wird's eigentlich erst, wenn es herabwürdigend oder schlicht falsch ist. Beides kann ich hier nicht erkennen. Er hat Recht: Der HTTP-Request wird nicht durch Leerzeilen, sondern durch das Empfangen der in Content-Length angegebenen Anzahl Bytes, das Empfangen eines Boundary Codes oder das Schließen der Verbindung (EOF) abgeschlossen.

    In diesem Sinne sorry für das dumm daherreden als Registrierter 🙂



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

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

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten