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%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) .