Perché avrebbe BufferedStream.Write tiro “Questo flusso non supporta le operazioni di ricerca”?

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

Domanda

Questo mi lascia perplesso. Ottengo un errore riguardante cercare quando non sto nemmeno chiamarla?

Ho codice che assomigli a questo:

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

e ottengo questa eccezione:

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)
...

flusso è di tipo System.IO.BufferedStream. Che cosa potrebbe essere in corso?

modifica con più informazioni:

sizeof(uint)==msg.length in questo caso.
Il flusso è dichiarato come stream = new BufferedStream(new NetworkStream(socket), 1024)

modifica:

Questo è tutto! Mentre si può leggere e scrivere su un singolo NetworkStream, quando si passa ad un BufferedStream è necessario avere uno separato per la lettura e la scrittura. Si può a quanto pare basta chiamare il costruttore NetworkStream due volte sullo stesso socket per ottenere che.

mi piacerebbe accettare sia Justin e risposte Hans', se potessi, perché uno mi permetta di capire esattamente che cosa era sbagliato, e l'altro mi ha portato alla soluzione. Grazie a tutti!

È stato utile?

Soluzione

Il problema sta nel il funzionamento interno di BufferedStream (e il fatto che si può avere usato il BufferedStream di leggere da prima di tentare di scrivere ad esso).

Quando si tenta di scrivere su un BufferedStream, dopo la convalida i parametri, le cose vengono controllati in questo ordine (tutto il codice tirato dal quadro mediante Reflector):


Siamo noi a chiedere l'elemosina del buffer di scrittura?

if(this._writePos == 0)

Non siamo autorizzati a scrivere nel flusso sottostante?

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

È il Leggi buffer vuoto?

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

Se ci sono dati da leggere nel buffer di lettura, una Scala viene tentata prima di scrivere. FlushRead) chiamate (seek (), che è quello che sta causando l'errore .

Altri suggerimenti

Si deve essere stato leggendo in precedenza da quella BufferedStream. Si sta facendo i suoi byte da un NetworkStream. Quelli sono a senso unico, è possibile solo leggere da solo o scrivere a loro, a seconda di come sono stati creati. Pubblica il codice che ha creato il NetworkStream se avete bisogno di più aiuto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top