2010-06-22 38 views
8

Éste me desconcierta. Me aparece un error al buscar cuando ni siquiera lo llamo?¿Por qué arrojaría BufferedStream.Write "Esta secuencia no es compatible con las operaciones de búsqueda"?

tengo código que se ve algo como esto:

// 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. ¿Qué podría estar pasando?

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)

edición:

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. Al parecer, simplemente se puede llamar al constructor NetworkStream dos veces en el mismo socket para obtenerlo.

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

+0

En caso de que ayuda, la BufferedStream es en la parte superior de un NetworkStream. – redtuna

+0

¿cómo ha declarado la secuencia de almacenamiento en búfer y de qué tamaño? ¿A qué tipo de flujo está asociado? y no debería sizeof (uint) ser msg.length? –

Respuesta

9

El problema radica en el funcionamiento interno de BufferedStream (y en el hecho de que puede haber usado el BufferedStream para leer 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 de la escritura ¿buffer?

if(this._writePos == 0) 

¿Se nos permite escribir en la secuencia subyacente?

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

¿Está vacío el búfer de lectura?

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 (llamadas) seek(), que es lo que está causando el error.

+0

bien, entonces no puedo llamar a escritura cuando hay datos no leídos ... lo que básicamente significa que no puedo tener una lectura de hilo y la otra escribir en el mismo BufferedStream. Ahora, dado que tengo un NetworkStream cuando me conecto a la otra computadora, ¿cómo consigo dos BufferedStreams? – redtuna

+0

@redtuna: si ese es tu objetivo, vas a tener que crear dos NetworkStreams para que coincidan con los dos BufferedStreams. De lo contrario, se encontrará con una gran cantidad de problemas con el NetworkStream compartido. –

+0

gracias @Justin. – redtuna

4

usted debe haber estado leyendo antes de que BufferedStream. Obtiene sus bytes de un NetworkStream. Esos son unidireccionales, solo puede leerlos o solo escribirles, dependiendo de cómo fueron creados. Publique el código que creó NetworkStream si necesita más ayuda.

+0

Usted puede estar en lo cierto: es posible que otro hilo está intentando leer al mismo tiempo, y que sería el problema.Los documentos dicen que puedes leer y escribir desde el mismo BufferedStream (y en el caso de la mía, tanto .CanRead como .CanWrite son verdaderos) pero quizás no al mismo tiempo. – redtuna

+0

Debería tener dos NetworkStreams y dos BufferedStreams, si estoy entendiendo el punto correctamente. Lee de uno y escribe en el otro. –

+0

@red: sí, BufferedStream admite lectura y escritura. Pero la secuencia desde la que lee/escribe podría no ser compatible. NetworkStream no. –

Cuestiones relacionadas