¿Por qué BufferedStream.Write tiro “Esta corriente no soporta operaciones de búsqueda”?

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

Pregunta

Éste me desconcierta. Me aparece un error acerca buscar cuando no estoy incluso llamándolo?

Tengo código que es como la siguiente:

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

y me sale esta excepción:

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

corriente es de tipo System.IO.BufferedStream. Lo que podría estar sucediendo?

edición con más información:

sizeof(uint)==msg.length en este caso.
La corriente se declara como stream = new BufferedStream(new NetworkStream(socket), 1024)

editar

Eso fue todo! Si bien se puede leer y escribir en una sola NetworkStream, cuando se cambia a un BufferedStream que es necesario tener una separada para la lectura y la escritura. Uno puede parecer sólo llamar al constructor NetworkStream dos veces en el mismo socket para conseguir eso.

Me aceptaría tanto Justin y respuestas de Hans si pudiera, porque uno me dejó exactamente entiendo lo que estaba mal, y el otro me llevó a la solución. Gracias a todos!

¿Fue útil?

Solución

El problema radica en el funcionamiento interno de BufferedStream (y el hecho de que es posible que haya utilizado el BufferedStream para leer desde antes de intentar escribir en él).

Cuando intenta escribir en un BufferedStream, después de validar los parámetros, las cosas se comprueban en este orden (todo el código retirado del marco a través del reflector):


¿Estamos en el año del principio del buffer de escritura?

if(this._writePos == 0)

¿Se nos permite escribir en la secuencia subyacente?

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

es el tampón de lectura vacío?

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

Si hay datos leídos en el búfer de lectura, una escalera se intenta antes de escribir. FlushRead () llama a seek (), , que es lo que está causando el error .

Otros consejos

Debe haber estado leyendo antes de que BufferedStream. Se está haciendo sus bytes de un NetworkStream. Esos son de un solo sentido, ya sea que sólo se puede leer o escribir sólo a ellos, según la forma en que fueron creados. Enviar el código que creó el NetworkStream si necesita más ayuda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top