Ja, siehe:
Quote:
Originally Posted by MrSm!th
genau, und wenn es 0 zurückgibt, wurde nichts mehr empfangen
genau so. du rufst recv so lange auf, bis es 0 zurückgibt, dann hast du nichts empfangen und der sendevorgang ist vorbei.
|
Genau daher rührt das ja. recv gibt solange etwas zurück, solange noch Daten im Netzwerkstream liegen.
Anders wäre Netzwerkkommunikation gar nicht möglich. Dateigrößen zu übermitteln wäre ja nicht das Problem, nur generell erstmal zu wissen, wie groß ein Packet wäre.
So ziemlich jedes Spiel hat verschiedene Packetstrukturen für verschiedene Zwecke, die auch unterschiedlich groß sind.
Der 3. Parameter spezifiziert nur die maximale Größe, aber wie viel davon tatsächlich genutzt wird, kannst du zum Zeitpunkt des Empfangens ja noch gar nicht wissen; erst, wenn du es empfangen hast und es parst, erfährst du anhand der eigenen Spezifikationen und Festlegungen, wie groß nun der Inhalt dieses Packettyps sein kann.
Da muss man genau so vorgehen: Man läuft in einer Schleife durch recv, bis nichts mehr empfangen wird.
recv ist ein blocking Call; wenn die Daten gerade noch auf dem Weg sind bzw. der Stream leer ist, bleibst du hängen, bis weitere Daten ankommen. Nur, wenn das Senden wirklich beendet ist, also mit keinen Daten mehr zu rechnen ist, der send Call beendet ist, dann wird 0 zurückgegeben.
Also wirst du recv nie mit 0 verlassen, außer der Sendevorgang ist beendet oder die Verbindung wurde unterbrochen.
Dementsprechend kannst du natürlich auch keine Daten "verlieren", wenn du gerade an einer anderen Stelle der Schleife bist, während Daten ankommen. Die warten dann im Stream auf die Abfrage per recv.