Wann gibt Socket.Receive die Daten zurück?

8

Anfänger Frage noch einmal: Eine Art Follow-up zu einer Frage, die ich vor kurzem gestellt habe.

Ich versuche, dieses synchrone Socket-Lernprogramm Ссылка zu verstehen, insbesondere eine einzelne Zeile in der Code unten.

FRAGE: Ich möchte sicherstellen, dass ich den Programmablauf richtig verstehe. Wenn die Prozedur handler.Receive (Bytes) zurückgibt? Gibt es zurück und speichert die Anzahl der Bytes, die in int bytesRec ** empfangen wurden, wenn es "überläuft" und mehr als 1024 Bytes empfangen hat? ** Und wenn das so ist , und dies klingt vielleicht albern, was passiert, wenn mehr Bytes ankommen, wie es die 1024 Bytes in der * Daten * - Variable speichert und nicht auf mehr Bytes wartet das könnte zu dieser Zeit ankommen? Oder sollte ich mir darüber keine Sorgen machen und .net sich darum kümmern?

%Vor%     
iAteABug_And_iLiked_it 20.03.2013, 12:47
quelle

1 Antwort

10
  

Wann gibt handler.Receive (Bytes) zurück?

Dokumentation:

  

Wenn keine Daten zum Lesen verfügbar sind, wird die Empfangsmethode blockiert   bis Daten verfügbar sind, sofern nicht ein Timeout-Wert mithilfe von festgelegt wurde   Socket.ReceiveTimeout. Wenn der Timeout-Wert überschritten wurde, wird der Empfang empfangen   Aufruf wird eine SocketException auslösen. Wenn Sie sich im nicht blockierenden Modus befinden,   und es sind keine Daten im Protokollpufferspeicher verfügbar,   Die Receive-Methode wird sofort beendet und ein "   SocketException Sie können die Available-Eigenschaft verwenden, um zu bestimmen, ob   Daten sind zum Lesen verfügbar. Wenn Verfügbar nicht Null ist, versuchen Sie es erneut   Operation empfangen.

  

Gibt es zurück und speichert die Anzahl der in int empfangenen Bytes   bytesRec, wenn es "überläuft" und mehr als 1024 Bytes empfangen hat?

Nein, es gibt immer die Anzahl der Bytes zurück, die gelesen wurden. Wenn nicht, wie könnten Sie wissen, welcher Teil von bytes aussagekräftige Daten enthält und welcher Teil davon nicht genutzt wurde?

Es ist sehr wichtig zu verstehen, wie Sockets normalerweise funktionieren: Bytes können in Paketen ankommen, aber so weit der Empfänger betroffen ist sollte jedes Byte unabhängig betrachtet werden . Dies bedeutet, dass es keine Garantie gibt, dass Sie die Bytes in den Chunks erhalten, die der Absender gesendet hat, und natürlich gibt es keine Garantie, dass genügend Daten vorhanden sind, um Ihren Puffer zu füllen.

Wenn Sie eingehende Daten nur in 1024-Byte-Blöcken verarbeiten möchten, liegt es in Ihrer eigenen Verantwortung, Receive solange aufzurufen, bis insgesamt 1024 Bytes für Sie freigegeben wurden.

  

Und wenn das so ist, und das klingt vielleicht albern, was passiert, wenn MEHR   Bytes ankommen, wie es die 1024 Bytes in der Variablen und speichert   nicht auf weitere Bytes warten, die zu dieser Zeit ankommen könnten?

Lassen Sie uns wiederholen, dass Receive keine 1024 Bytes im Puffer speichert, da dies die Größe des Puffers ist. Es speichert bis zu 1024 Bytes.

Wenn intern mehr Daten vom Netzwerkstack gepuffert werden, als Ihr Puffer halten kann, werden Ihnen 1024 Bytes zurückgegeben und der Rest bleibt in den Puffern des Netzwerkstapels, bis Sie Receive erneut aufrufen. Wenn Receive begonnen hat, Daten in Ihren Puffer zu kopieren und in diesem Moment mehr Daten vom Netzwerk empfangen werden, dann werden diese höchstwahrscheinlich auf den nächsten Receive -Aufruf warten müssen.

Schließlich gab niemand zu irgendeinem Zeitpunkt eine Garantie, dass Receive Ihnen alle Daten geben würde (obwohl das natürlich wünschenswert ist und es die meiste Zeit passiert) .

    
Jon 20.03.2013, 12:58
quelle

Tags und Links