2009-06-17 5 views
3

Ich möchte Puffer der Steckdose leeren lesen, damit ich folgen Code ... ist So rufen Sie NetworkStream.Read() ohne Blockierung auf?

Aber Read() Methode

byte[] tempBuffer = new byte[1024]; 
int readCount = 0; 
while ((readCount = tcpSocket.GetStream().Read(tempBuffer, 0, tempBuffer.Length)) != 0) 
{ 
    // do with tempBuffer 
} 
blockiert schrieb so habe ich tcpSocket.ReceiveTimeout = 1;. Und es funktioniert genauso wie vorher.

Wie ich weiß, wird dies normalerweise in C++ verwendet. Wie kann ich dieses Problem lösen?

Antwort

4

Sie können die Eigenschaft DataAvailable verwenden, um zu sehen, ob etwas gelesen werden muss, bevor Sie die Read-Methode aufrufen.

+0

Ich habe meinen Code mit try-catch blockiert, um die Trennung zu erkennen. Wie kann ich die DataAvailable-Eigenschaft verwenden? –

+0

Wenn Sie in meiner Antwort dem Link zur DataAvailable-Methode folgen, sehen Sie, dass es ein Codebeispiel gibt, das Ihren Wünschen entspricht. Es steht Ihnen natürlich frei, das Ganze in einen Try-Catch zu verpacken, um die Trennung zu umgehen. –

2

Verwenden Sie die NetworkStream.Read() Funktion direkt, statt GetStream() der Verwendung:

Wenn keine Daten zum Lesen verfügbar ist, die Read-Methode 0. Die Operation Read kehrt liest so viele Daten wie verfügbar ist, bis zur Anzahl der Bytes , die durch den Parameter Größe angegeben werden. Wenn der Remote-Host die -Verbindung herunterfährt und alle verfügbaren Daten empfangen wurden, wird die Read-Methode sofort beendet und gibt Bytes zurück. Hinweis:

+0

Was meinen Sie mit der Funktion ** direkt **? Es gibt nicht diese statische Elementfunktion. Lass mich bitte einen Code sehen. –

+0

das ist keine statische Funktion. Wenn Sie den von mir bereitgestellten MSDN-Link gelesen hätten, hätten Sie gesehen, dass dies eine Methode für das NetworkStream-Objekt ist. Da Sie den tatsächlichen Typ Ihrer 'tcpSocket'-Variable nicht angeben konnten, musste ich vom Rest Ihres Textes raten. –

+4

Ich bin mir nicht sicher, worüber du hier redest. Das OP verwendet tatsächlich ein NetworkStream-Objekt über 'tcpSocket.GetStream()'. – danyim

1

Warum möchten Sie den Lesepuffer leeren? Wenn Sie nicht möchten, dass der Inhalt des Sockets es schließt. Wenn Sie den aktuellen Inhalt nicht möchten, aber später Daten möchten, wie wissen Sie, wenn später gestartet wird. Wenn die Daten ein nicht gekapselter Stream sind ...

Klingt, als ob Sie das Problem auf die falsche Art lösen.

+0

Was ich mit dem Leeren des Puffers meinte, ist nur, dass ich alle Daten aus dem Puffer lesen und versenden wollte, nicht überspringe. Normalerweise mache ich so, wenn ich Server mache. –