2013-03-20 6 views
8

Anfänger Frage noch einmal: Eine Art Follow-up zu einer Frage, die ich vor nicht allzu langer Zeit gestellt habe.Wann gibt Socket.Receive die Daten zurück?

Ich versuche dieses synchrone Socket Tutorial http://msdn.microsoft.com/en-us/library/6y0e13d3.aspx zu verstehen, insbesondere eine einzelne Zeile in dem Code unten.

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

Socket handler = listener.Accept(); 
data = null; 

// An incoming connection needs to be processed. 
while (true) { 
    bytes = new byte[1024]; 
    int bytesRec = handler.Receive(bytes); 
    // My question is WHEN does the following line 
    // get to be executed 
    data += Encoding.ASCII.GetString(bytes,0,bytesRec); 
    if (data.IndexOf("<EOF>") > -1) { 
     break; 
    } 
} 

Antwort

10

Wann handler.Receive (Bytes) zurückgeben?

Dokumentation:

Wenn keine Daten zum Lesen verfügbar ist, wird die Methode Receive blockieren, bis Daten verfügbar sind, es sei denn, ein Timeout-Wert unter Verwendung von Socket.ReceiveTimeout gesetzt wurde. Wenn der Zeitüberschreitungswert überschritten wurde, löst der Aufruf eine SocketException aus. Wenn Sie sich im nicht blockierenden Modus befinden und keine Daten im Puffer des Protokollstapels verfügbar sind, wird die Receive-Methode sofort ausgeführt und eine SocketException ausgelöst. Sie können die Eigenschaft "Verfügbar" verwenden, um zu bestimmen, ob Daten zum Lesen verfügbar sind. Wenn Verfügbar nicht Null ist, wiederholen Sie die Empfangsoperation.


Ist es zurückgeben und speichert die Anzahl der Bytes in int bytesRec empfangen werden, 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 ungenutzt geblieben ist?

Es ist sehr wichtig zu verstehen, wie Buchsen arbeiten in der Regel: Bytes in Pakete ankommen können, aber soweit der Empfänger betrifft jedes Byte sollte unabhängig in Betracht gezogen 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 nur eingehende Daten in 1024-Byte-Blöcken verarbeiten möchten, liegt es in Ihrer eigenen Verantwortung, Receive so lange anzurufen, bis insgesamt 1024 Byte für Sie freigegeben wurden.

Und wenn das so ist, und das klingt vielleicht albern, was passiert, wenn mehr Bytes ankommen, wie es speichert hören, das 1024 Bytes in den Variablen und nicht mehr Bytes, die zu diesem Zeitpunkt ankommen könnten?

Noch einmal wiederholen, dass Receive keine 1024 Bytes im Puffer speichert, da dies die Puffergröße 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 erneut Receive aufrufen. Wenn Receive mit dem Kopieren von Daten in den Puffer begonnen hat und in diesem Moment mehr Daten vom Netzwerk empfangen werden, ist es wahrscheinlich, dass diese auf den nächsten Receive-Aufruf warten müssen.

Immerhin an keiner Stelle jemand eine Garantie dafür haben, dass Receive Sie alle die Daten kann es geben würde (obwohl natürlich die wünschenswert ist, und es ist das, was die meiste Zeit geschieht).

+0

Sie können sich denken, Empfangen ähnlich wie das Lesen aus einer Datei. Wenn sich noch genug Datenbytes in der Datei befinden (in diesem Fall Netzwerkstack), wird die Größe des Puffers von oben wieder erreicht. Andernfalls werden die restlichen Daten zurückgegeben (die unter der Puffergröße liegen können). . – shellster

+0

@shellster: Art von. Aber diese Beschreibung wirft einen Blick auf die sehr wichtige Tatsache, dass der Netzwerkstack entscheiden kann, Ihnen Daten in allen von ihm ausgewählten Stücken zu übergeben. Es gibt keine Garantie. – Jon

+1

@ Jon danke für eine super Antwort. Wenn du sagst: "Der Netzwerkstack kann dir entscheiden, dir Daten in welchen Stücken zu überreichen", heißt das, dass mein Klient "Sorry Liebling, ich bin nicht Single, aber verheiratet" senden kann, aber mein Server kann "eh verheiratet" erhalten "entschuldige Liebling"? Der oben genannte Microsoft Code macht keine solche Fehlerüberprüfung ... würde nicht TCP/IP dafür sorgen, dass ich Daten in der richtigen Reihenfolge erhalte –

Verwandte Themen