Ich versuche, die Anzahl der Bytes zu ermitteln, die zum Lesen verfügbar sind, so dass ich von der SslStream
lesen kann, bis alle Daten gelesen wurden. SslStream
scheint keine Eigenschaft oder Methode dafür zu haben, also habe ich versucht, die zugrunde liegende Socket
zu verwenden. Das Problem hier ist, dass die Anzahl der verfügbaren Bytes, wie von der Socket
gemeldet, nicht mit der tatsächlichen Menge der entschlüsselten Daten, die ich brauche, übereinstimmt.Kann die Anzahl der verfügbaren Bytes für SslStream nicht bekommen
Hier ist meine Methode Receive:
byte[] Receive()
{
byte[] messageBuffer = new byte[4096];
int bytesRead = 0;
using (var readData = new MemoryStream())
{
while(Client.Client.Available > 0)
{
bytesRead = Stream.Read(messageBuffer, 0, messageBuffer.Length);
readData.Write(messageBuffer, 0, bytesRead);
}
return readData.ToArray();
}
}
Client.Client
ist die zugrunde liegende Socket
von Stream
, die die SslStream
ist. Nehmen wir eine Nachrichtengröße von 5000 Bytes an. Es gibt ein paar Probleme hier:
- Der erste Versuch
Client.Client.Available
kehrt 5077. Dies ist nicht die richtige Länge der zu lesende Daten vorhanden. - Nach dem ersten Anruf an
Stream.Read
Client.Client.Available gibt 0 zurück, also verlasse ich die Schleife, obwohl ich nur 4096 gelesen habe, da das meine Puffergröße ist. Es verbleiben also 904 Bytes im Stream, die nicht gelesen wurden.
So scheint es, dass, nachdem ich Stream.Read
nenne es die gesamten Daten aus dem Sockel entfernt (alle 5000 Bytes nicht nur die 4096 für frage mich), was Sinn macht, weil Sie die gesamte Nachricht brauchen es zu entschlüsseln. Aber es gibt keine Möglichkeit zu wissen, ob Sie die gesamte Nachricht erhalten haben, denn es gibt keine SslStream.Available
oder etwas Ähnliches. Meine Frage ist also, wie kann ich feststellen, ob ich die gesamte entschlüsselte Nachricht erhalten habe? (Oder wie kann ich die Anzahl der Bytes der entschlüsselte Nachricht?)
Andere Dinge, die ich versucht habe:
- mit
Client.Client.Poll(someLongTimeoutForTesting, SelectMode.SelectRead)
aber es gibt false zurück, nach dem erstenStream.Read
auch. - mit
Client.GetStream().DataAvailable
wieder false zurück, nachdem die erstenStream.Read
- die Größe des Message auf den maximalen Betrag zu erhöhen Stream.Read zurückkehren (16299, nicht sicher, warum diese Zahl aber wenn ich erhöhe die Nachrichtengröße und Puffergröße über diesem
Stream.Read()
gibt immer 16299 zurück). Diese Methode funktioniert, aber es verwendet eine unangemessene Menge an Speicher, da in der Anwendung in den Client Nachrichten unter 4096 99,99% der Zeit verwendet werden.
Ich weiß nicht die Länge der Nachricht, das ist genau das, was ich versuche zu bestimmen.Ich habe 5000 in meinem Beispiel verwendet, um mein Problem zu demonstrieren – CSCoder