为什么 BufferedStream.Write 会抛出“此流不支持查找操作”?

2024-03-09

这个让我很困惑。当我什至没有调用它时,我收到有关搜索的错误?

我的代码看起来像这样:

// 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构造函数在同一个套接字上两次以获取该值。

如果可以的话,我会接受贾斯汀和汉斯的答案,因为一个让我确切地理解出了什么问题,另一个让我找到了解决方案。感谢大家!


问题在于 BufferedStream 的内部工作原理(事实上,您可能在尝试写入之前已使用 BufferedStream 进行读取)。

当您尝试写入 BufferedStream 时,在验证参数后,将按以下顺序检查内容(通过 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(),这就是导致你的错误的原因.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 BufferedStream.Write 会抛出“此流不支持查找操作”? 的相关文章

随机推荐