为什么BufferedStream.Write会抛出"此流不支持搜索操作"?

red*_*una 9 c# networkstream bufferedstream

这个让我困惑.当我甚至没有打电话时,我收到关于寻找的错误?

我的代码看起来像这样:

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

我得到这个例外:

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)
...
Run Code Online (Sandbox Code Playgroud)

流是类型System.IO.BufferedStream.可能会发生什么?

编辑更多信息:

sizeof(uint)==msg.length在这种情况下.
流声明为stream = new BufferedStream(new NetworkStream(socket), 1024)

编辑:

就是这样!虽然可以在一个单独读取和写入NetworkStream,但当切换到BufferedStream它时,必须有一个单独的读取和写入.显然,只需NetworkStream在同一个套接字上调用构造函数两次即可.

如果可以的话,我会接受Justin和Hans的答案,因为我让我完全理解错误,另一个让我找到解决方案.感谢大家!

Jus*_*ner 9

问题在于BufferedStream的内部工作方式(以及您在尝试写入之前可能已使用BufferedStream进行读取的事实).

当您尝试写入BufferedStream时,在验证参数后,将按此顺序检查事物(通过Reflector从Framework中提取所有代码):


我们是在写缓冲区的乞讨吗?

if(this._writePos == 0)
Run Code Online (Sandbox Code Playgroud)

我们是否可以写入底层流?

if(!this._s.CanWrite) // throw error
Run Code Online (Sandbox Code Playgroud)

Read缓冲区是空的吗?

if(this._readPos < this._readLen)
{
    // FlushRead() will attempt to call Seek()
    this.FlushRead();
}
Run Code Online (Sandbox Code Playgroud)

如果读缓冲区中有未读数据,则在写入之前尝试刷新.FlushRead()调用Seek(),这是导致错误的原因.


Han*_*ant 5

您之前一定已经从该 BufferedStream 中读取过内容。它从 NetworkStream 获取字节。这些是单向的,您只能读取或只能写入它们,具体取决于它们的创建方式。如果您需要更多帮助,请发布创建 NetworkStream 的代码。