Wie benutzt man recv richtig?



  • Hi,
    ich komme damit nicht so ganz klar:
    Wenn ich recv benutze (bei z.B. 30kb Transfer) und mein Buffer groß genug ist, die Parameter auch angepasst sind, kommen trotzdem nur ~8kb an. (Anbeifrage: Außerdem schien das auch zu variieren, vllt. erinnere ich mich auch falsch, naja, aber woran liegt diese Limitierung?)
    Wenn ich nun versuche, solange zu recv'en, bis der Rückgabewert 0 ist, scheint es soweit zu klappen, aber nur, wenn die Verbindung vom Socket bereits gecloset wurde, ansonsten blockiert es endlos..
    Ich habe Winsock noch nicht häufig benutzt und irgendwie bin ich zu blöd dahinter zu steigen, wie ich überhaupt erst einmal richtig etwas empfange..
    Naja, ich hoffe auf Hilfe, danke 🙂



  • Mohr schrieb:

    Wenn ich recv benutze (bei z.B. 30kb Transfer) und mein Buffer groß genug ist, die Parameter auch angepasst sind, kommen trotzdem nur ~8kb an.

    Welcome to the world of TCP...

    Mohr schrieb:

    Wenn ich nun versuche, solange zu recv'en, bis der Rückgabewert 0 ist, scheint es soweit zu klappen, aber nur, wenn die Verbindung vom Socket bereits gecloset wurde, ansonsten blockiert es endlos..

    Klar, recv blockiert bis es was zu lesen gibt...

    Erzähl mal was genau jetzt dein Problem ist, was du beschreibst ist jedenfalls nur das ganz normale Verhalten von recv...



  • hehe

    Wie genau mache ich es jetzt, dass ich alles, was es bisher zu lesen gibt, lese, ohne es wieder blockieren zu lassen..
    Thx



  • Natürlich gibt es die asynchronen Funktionen, non-blocking sockets und Threads und select usw. Aber ich bezweifle dass du das willst.
    Wenn du weißt wieviel du lesen willst hörst du auf sobald alles angekommen ist und fertig. TCP ist ein stream, da verschickst du keine "Pakete" und kannst daher nicht davon ausgehen dass mit einem Mal alles angekommen ist. Theoretisch könnte die Hälfte der Daten erst 42 min. später eintrudeln...



  • Achso, ein Strang statt einzelner Pakete? Hm..
    Also müsste ich nach jedem recv die Daten parsen und entscheiden, ob nun ein Paket vollständig ist?
    Wie müsste ich das dann bei HTTP mit keep-alive machen?
    Bei Connection: close könnte man ja einfach recv in einer Schleife callen, da recv am Ende ja 0 returnt, oder?
    Danke für deine Hilfe 🙂



  • Mohr schrieb:

    Achso, ein Strang statt einzelner Pakete? Hm..
    Also müsste ich nach jedem recv die Daten parsen und entscheiden, ob nun ein Paket vollständig ist?

    Genau

    Mohr schrieb:

    Wie müsste ich das dann bei HTTP mit keep-alive machen?
    Bei Connection: close könnte man ja einfach recv in einer Schleife callen, da recv am Ende ja 0 returnt, oder?

    Ich hab HTTP noch nie implementiert und müsste mich da jetzt erst mal in die Specs einlesen, aber ja recv() gibt 0 zurück wenn die Verbindung geschlossen und alles empfangen wurde.


Anmelden zum Antworten