Warum sollte BufferedStream.Write throw „Dieser Stream unterstützt keine Operationen suchen“?

StackOverflow https://stackoverflow.com/questions/3095640

Frage

Dies mir ein Rätsel. Ich erhalte eine Fehlermeldung über zu suchen, wenn ich es nicht einmal ich anrufen?

Ich habe Code, der in etwa so aussieht:

// send 42
uint value = 42;
byte[] msg = BitConverter.GetBytes(value);
stream.Write(msg, 0, sizeof(uint));

und ich diese Ausnahme erhalten:

System.NotSupportedException was unhandled
Message="This stream does not support seek operations."
Source="System"
StackTrace:
   at System.Net.Sockets.NetworkStream.Seek(Int64 offset, SeekOrigin origin)
   at System.IO.BufferedStream.FlushRead()
   at System.IO.BufferedStream.Write(Byte[] array, Int32 offset, Int32 count)
...

Strom ist vom Typ System.IO.BufferedStream. Was könnte auf gehen?

Bearbeiten mit mehr Info:

sizeof(uint)==msg.length in diesem Fall.
Der Strom wird als stream = new BufferedStream(new NetworkStream(socket), 1024) erklärt

edit:

Das war es! Während man auf einem einzigen NetworkStream lesen und schreiben kann, wenn sie auf eine BufferedStream Schalt ist es notwendig, ein separates für das Lesen und Schreiben zu haben. Man kann offenbar rufen Sie einfach den NetworkStream Konstruktor zweimal auf der gleichen Buchse, dass zu erhalten.

Ich würde sowohl Justin und Hans' Antworten akzeptieren, wenn ich könnte, weil man läßt mich genau verstehen, was falsch war, und der andere mich zu der Lösung geführt. Danke an alle!

War es hilfreich?

Lösung

Das Problem liegt in dem Innenleben von BufferedStream (und die Tatsache, dass Sie von dem BufferedStream zu lesen verwendet haben, können vor dem Schreiben auf, es zu versuchen).

Wenn Sie versuchen, auf eine BufferedStream zu schreiben, nach dem Parameter Validierung, die Dinge in dieser Reihenfolge überprüft (alle Code aus dem Rahmen über Reflektor gezogen):


Sind wir auf dem Betteln des Schreibpuffers?

if(this._writePos == 0)

Sind wir auf den zugrunde liegenden Stream schreiben erlaubt?

if(!this._s.CanWrite) // throw error

Ist das Lesen leer Puffer?

if(this._readPos < this._readLen)
{
    // FlushRead() will attempt to call Seek()
    this.FlushRead();
}

Wenn es ungelesene Daten in dem Lesepuffer wird ein Flush vor dem Schreiben versucht. FlushRead () Anrufe Seek (), , das ist, was Ihr Fehler verursacht .

Andere Tipps

Sie müssen das Lesen von diesem BufferedStream früher wurden. Es wird immer sein Bytes aus einem Network. Das ist one-way, können Sie entweder nur gelesen oder nur auf sie schreiben, je nachdem, wie sie erstellt wurden. Stellen Sie den Code, der das Network erstellt, wenn Sie weitere Hilfe benötigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top