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,
InformationsquelleAutor hultqvist | 2011-05-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben, Lesen Sie die Dokumentation?
0 bytes zu Lesen bedeutet, dass der remote-Endpunkt getrennt haben.
Entweder verwenden Sie blockierende sockets oder verwenden Sie die asynchronen Methoden wie
BeginReceive()
. Es gibt keine Notwendigkeit fürPoll
.Net.Es war vor langer Zeit Las ich den doc. Ich kann bestätigen, dass ist nicht wirklich klar. Sie sollten immer behandeln
0
als Rückgabewert vonReceive()
wie Trennung, egal welche anderen Methoden/Eigenschaften sagen. Zitat von MSDN:If you are in non-blocking mode, and there is no data available in the in the protocol stack buffer, the Receive method will complete immediately and throw a SocketException
. Ich stark empfehlen, dass Sie aufhören, mit nicht-blockierende sockets .NET.Sie haben eine detaillierte Erklärung hier : stackoverflow.com/a/1388691/1529139
Ich habe versehentlich nach unten gestimmt die Antwort und kann es nicht rückgängig machen, jetzt.
Sie können nun.
InformationsquelleAutor jgauffin