Почему бы BufferedStream.Write выбросить «Этот поток не поддерживает операции поиска»? - PullRequest
9 голосов
/ 22 июня 2010

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

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

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

edit:

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

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

Ответы [ 2 ]

9 голосов
/ 22 июня 2010

Проблема заключается во внутренней работе 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();
}

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

4 голосов
/ 22 июня 2010

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

...