Maximale größe beim Empfangen mit recv



  • Hi,
    Ich empfange Daten mit recv, weiß aber vorher immer genau wieviele bytes ich empfangen will.
    Kann ich dann einfach recv(fd, entsprechend_große_variable, varaible_mit_der_länge, 0) machen, wobei die varaible_mit_der_länge eine bis zu sieben-stellige Zahl enthalten kann, oder hat TCP/IP eine maximalgröße für recv (davon gehe ich eigentlich aus)?



  • Die Idee ist, dass du recv sagst, wieviele Bytes _maximal_ empfangen werden sollen, damit dein Puffer nicht überläuft. (Denn schließlich müssen die empfangenen Bytes ja irgendwo hin.)

    Nach Aufruf der Funktion bekommst du gesagt, wieviele Bytes tatsächlich gelesen wurden. Das können durchaus weniger sein als du dir gedacht hast, aber gewiss nicht mehr.



  • Nun, ich weiß ja vorher genau wieviel Bytes kommen werden. Mein Problem ist eher wenn recv eine maximale Größe hat, muss ich das ganze in ne Schleife packen, wenn nicht, kann ich mir das sparen...



  • Es gibt keine garantierte Mindestanzahl an Bytes, auch wenn die Wahrscheinlichkeit für eine kleine Anzahl größer ist. Um deine Schleife wirst du nicht herumkommen.



  • Was meinst du mit garantierter Midenstanzahl? Ich weiß immer genau wieviel Bytes kommen werden. Wie auch immer, ich werd zur Sicherheit ne Schleife verwenden.



  • Das ist ineffizient. Versuche immer große Blöcke mit recv zu holen.



  • Luke-2 schrieb:

    Ich weiß immer genau wieviel Bytes kommen werden.

    Ne tust du nicht.



  • Black Shadow schrieb:

    Luke-2 schrieb:

    Ich weiß immer genau wieviel Bytes kommen werden.

    Ne tust du nicht.

    Erklär warum.

    Ich schicke Immer erst 7 Byte für die Länge, danach entsprechend Daten.

    PS: Ich würde jetzt so vorgehen: Mit recv die Daten mit der übermittelten Länge laden. Wenn die tatsächlich empfangenen Daten < als die erwartete Länge, entsprechend weiterladen. Das wiederholen bis alle Daten geladen sind. Wär das ok?



  • Die Daten werden nach und nach übertragen und sind nicht schlagartig da, folglich kannst du nicht wissen wieviel schon übertragen wurde.
    Du weißt nach den ersten bytes vllt. wieviel kommen sollte, aber wann weißt du nicht und ob auch nicht (abbruch zb.).



  • Luke-2 schrieb:

    Black Shadow schrieb:

    Luke-2 schrieb:

    Ich weiß immer genau wieviel Bytes kommen werden.

    Ne tust du nicht.

    Erklär warum.

    Ich schicke Immer erst 7 Byte für die Länge, danach entsprechend Daten.

    PS: Ich würde jetzt so vorgehen: Mit recv die Daten mit der übermittelten Länge laden. Wenn die tatsächlich empfangenen Daten < als die erwartete Länge, entsprechend weiterladen. Das wiederholen bis alle Daten geladen sind. Wär das ok?

    TCP garantiert Dir zwar das deine Bytes in der Reihenfolge ankommen wie du sie abgeschickt hast, aber nicht das es zu jedem write ein korrespondierendes read gibt und umgekehrt.


Log in to reply