Basierend auf dem Rat von @ Len-Holgate in dieser Frage , ich ' asynchrones Anfordern von 0-Byte-Lesevorgängen, und im Rückruf akzeptieren Bytes die verfügbaren Bytes mit synchronen Lesevorgängen, da ich weiß, dass die Daten verfügbar sind und nicht blockieren. Das scheint so effizient und wunderbar zu sein.
Aber dann füge ich die Option für SslStream hinzu, und der Ansatz fällt auseinander. Der Null-Byte-Lesevorgang ist in Ordnung, aber der SslStream entschlüsselt die Bytes und hinterlässt im Puffer des TcpClients eine Null-Byte-Zahl (entsprechend), und ich kann nicht feststellen, wieviele Bytes jetzt im SslStream zum Lesen verfügbar sind.
Gibt es dafür einen einfachen Trick?
Irgendein Code, nur für den Kontext:
%Vor%Und nach dem EndRead () (das korrekt 0 zurückgibt) enthält DataAvailable Folgendes:
%Vor%Und aufgrund des Protokolls muss ich Byte für Byte auswerten und Variable-Byte-Width-Unicode und Zeug dekodieren. Ich möchte Byte für Byte nicht asynchron lesen müssen!
Wenn ich richtig verstanden habe, werden Ihre Nachrichten durch ein bestimmtes Zeichen begrenzt, und Sie verwenden bereits StringBuilder
, um den Fall abzudecken, wenn eine Nachricht in mehrere Teile fragmentiert wird.
Sie könnten das Trennzeichen ignorieren, wenn Sie Daten lesen, Daten hinzufügen, sobald diese verfügbar sind, und dann das lokale StringBuilder
für das Trennzeichen prüfen. Wenn Sie gefunden werden, können Sie eine einzelne Nachricht mit sb.ToString(0, delimiterIndex)
und sb.Remove(0, delimiterIndex)
extrahieren, bis keine Trennzeichen mehr vorhanden sind.
Dies würde auch den Fall abdecken, wenn zwei Nachrichten gleichzeitig empfangen werden.
Tags und Links c# asynchronous tcpclient sslstream