¿Por qué BufferedStream.Write tiro “Esta corriente no soporta operaciones de búsqueda”?
-
29-09-2019 - |
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!
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.