Этот озадачивает меня. Я добираюсь, ошибка об ищут, когда я даже не называю ее?
У меня есть код, который выглядит примерно так:
// 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 и ответы ханьцев, если я мог, потому что каждый позволил мне точно понять то, что было неправильным, и другой ведомый меня к решению. Спасибо все!
Проблема заключается во внутренней работе 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(), что и вызывает вашу ошибку.
Вы, должно быть, раньше читали из этого BufferedStream. Он получает свои байты из NetworkStream. Они односторонние, вы можете либо только читать, либо только писать в них, в зависимости от того, как они были созданы. Опубликуйте код, создавший NetworkStream, если вам нужна дополнительная помощь.