Warum socket liest 0 bytes, wenn mehr verfügbar war

Entdeckte ich, dass der folgende code-loops mit 100% CPU-Auslastung:

byte[] buffer = new byte[0x10000];
while (true) {
    if (socket.Poll (5000000, SelectMode.SelectRead) == false)
        continue;
    int available = socket.Available;
    if (available == 0)
        return;
    int read = socket.Receive (buffer);
    Console.WriteLine ("Read: " + read + " Available: " + available);
    /* ... */
}

Ausgabe:

Read: 0 Available: 1
Read: 0 Available: 1
Read: 0 Available: 1
Read: 0 Available: 1
Read: 0 Available: 1
...

Erwartete ich den sockel.Receive-Methode zu Lesen, dass auch die restlichen byte-aber es offenbar nicht, was in meinem code-Schleife bei 100%.

Vorgeschlagen von jgauffin die Dokumentation liest:

Wenn der remote-host wird heruntergefahren, die
Socket-Verbindung mit dem Herunterfahren
Methode, und alle verfügbaren Daten
empfangen wurden
, die Receive-Methode
sofort abgeschlossen und return null
bytes.

So Lesen 0 ist irgendwie erwartet, dass aber erst, nachdem alle Daten gelesen, die Buchse.Ansprüche nicht.

Dokumentation für Socket.Verfügbar nur erwähnen, eine geschlossene Verbindung eine Ausnahme zu werfen.

Wie konnte ich sicher sein, dass das Letzte byte gelesen wird?

Verwandte: diese ist eine Antwort darauf, wie zu erkennen, eine geschlossene Verbindung, abhängig von der Steckdose.Verfügbar wird 0, wenn es keine Daten mehr und die Verbindung wird geschlossen,

Ich denke, dass es ein bug ist, dass das zur Verfügung gibt 0 zurück, wenn die Verbindung geschlossen worden. Jemand aus MS vielleicht finden Sie Ihre Frage und geben eine richtige Antwort. Was Sie tun können, ist zu versuchen, etwas senden und sehen Sie die Anzahl der bytes, die Send-Methode gibt. Wenn es gibt 0 zurück, die Verbindung ist wirklich geschlossen.

InformationsquelleAutor hultqvist | 2011-05-03

Schreibe einen Kommentar