Pregunta

Recibo la excepción siguiente:

System.NotSupportedException : This stream does not support seek operations.
   at System.Net.Sockets.NetworkStream.Seek(Int64 offset, SeekOrigin origin)
   at System.IO.BufferedStream.FlushRead()
   at System.IO.BufferedStream.WriteByte(Byte value)

El enlace de seguimiento muestran que este es un problema conocido de Microsoft. http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback. aspx? FeedbackID = 273186

Esta StackTrace mostrar 2 cosas:

  1. El System.IO.BufferedStream hacer alguna operación puntero de desplazamiento absurdo. Un BufferedStream debe amortiguar la secuencia subyacente y no más. La calidad de tampón será malo si hay tal operación de búsqueda.
  2. Nunca va a funcionar con una corriente estable que es compatible con Seek.

¿Hay alguna alternativa? Lo hace Necesito un búfer junto con un NetworkStream en C # o se trata de que ya esté almacenado.

Editar:. Yo quiero simplemente reducir el número de lectura / escritura de las llamadas a la corriente subyacente toma

¿Fue útil?

Solución

La solución es el uso de dos BufferedStreams independientes, una para recibir y otra para el envío. Y no se olvide de enjuagar el envío de BufferedStream adecuadamente.


Dado que incluso en 2018 parece difícil obtener una respuesta satisfactoria a esta pregunta, por el bien de la humanidad, aquí están mis dos centavos:

El NetworkStream es buffer en el lado SO. Sin embargo, eso no significa que no hay razones para amortiguar en el lado .net. TCP se comporta bien en escritura-lectura (repetición), pero detiene la escritura sobre-escritura-Lee, debido a ACK retrasado, etc, etc.

Si, como yo, tiene un montón de código de protocolo por debajo del par a tener en el siglo XXI, que deberán ser respaldados.

Como alternativa , si nos atenemos a lo anterior, se podría también sólo tampón lee / las votaciones nominales o sólo escribe / envía, y utilizar el NetworkStream directamente por el otro lado, dependiendo de cómo roto lo que el código es . sólo hay que ser coherentes!

¿Qué BufferedStream documentos no pueden hacer muy claro es que usted debe desactivar únicamente la lectura y la escritura si su flujo es reubicable . Esto se debe a que amortigua lee y escribe en el mismo tampón. BufferedStream simplemente no funciona bien para NetworkStream.

Como se señaló Marc, la causa de esta cojera es la fusión de dos corrientes en una NetworkStream que no es una de las decisiones de diseño más grande del .net.

Otros consejos

El NetworkStream ya está amortiguada. Todos los datos recibidos se guardan en una memoria intermedia de espera para que lo lea. Las llamadas a leer, o bien ser muy rápido, o bloqueará la espera de los datos a ser recibidos desde el otro par en la red, un BufferedStream no ayudará en cualquiera de los casos.

Si usted está preocupado por el bloqueo a continuación, se puede ver en la toma de conmutación que subyace a modo de no bloqueo.

A BufferedStream simplemente actúa para reducir el número de llamadas de lectura / escritura a la corriente subyacente (que puede ser IO / hardware ligado). No puede proporcionar la capacidad de buscar (y, de hecho, el almacenamiento en búfer y la búsqueda son en muchos sentidos contrarios a unos de otros).

¿Por qué es necesario buscar? Quizás copiar la corriente a algo reubicable primero - un MemoryStream o una FileStream -. A continuación, hacer su trabajo real de ese segundo, corriente reubicable

¿Tiene un propósito específico en mente? Puede que sea capaz de sugerir opciones más apropiadas con más detalles ...

En particular: NetworkStream en cuenta que es una curiosidad - con la mayoría de las corrientes, de lectura / escritura se relacionan con el mismo flujo de física; sin embargo, un NetworkStream representa en realidad dos tubos completamente independientes; leer y escribir son completamente ajenos. Del mismo modo, no se puede buscar en bytes que ya han pasado con cremallera que se puede ... salto de datos, pero que es mejor hacerlo haciendo algunas opdrations Read y descartando los datos.

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