Почему был бы BufferedStream. Запишите, что бросок “Этот поток разве поддерживает, не ищет операции”?

Этот озадачивает меня. Я добираюсь, ошибка об ищут, когда я даже не называю ее?

У меня есть код, который выглядит примерно так:

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

и я получаю это исключение:

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

поток имеет тип System.IO.BufferedStream. Что могло возможно продолжаться?

редактирование с большим количеством информации:

sizeof(uint)==msg.length в этом случае.
Поток объявляется как stream = new BufferedStream(new NetworkStream(socket), 1024)

править:

Вот и все! В то время как можно читать и записать на сингле NetworkStream, при переключении на a BufferedStream необходимо иметь отдельное для чтения и записи. Можно, по-видимому, просто звонить NetworkStream конструктор дважды на том же сокете для получения этого.

Я принял бы и Justin и ответы ханьцев, если я мог, потому что каждый позволил мне точно понять то, что было неправильным, и другой ведомый меня к решению. Спасибо все!

9
задан ken2k 28 March 2012 в 13:56
поделиться

2 ответа

Проблема заключается во внутренней работе BufferedStream (и в том факте, что вы, возможно, использовали BufferedStream для чтения перед попыткой записи в него).

Когда вы пытаетесь записать в BufferedStream, после проверки ваших параметров все проверяется в следующем порядке (весь код взят из Framework через Reflector):


Находимся ли мы в начале буфера записи?

if(this._writePos == 0)

Разрешена ли нам запись в базовый поток?

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

Пуст ли буфер чтения?

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

Если в буфере чтения есть непрочитанные данные, перед записью выполняется попытка Flush. FlushRead() вызывает Seek(), что и вызывает вашу ошибку.

9
ответ дан 4 December 2019 в 15:11
поделиться

Вы, должно быть, раньше читали из этого BufferedStream. Он получает свои байты из NetworkStream. Они односторонние, вы можете либо только читать, либо только писать в них, в зависимости от того, как они были созданы. Опубликуйте код, создавший NetworkStream, если вам нужна дополнительная помощь.

4
ответ дан 4 December 2019 в 15:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: