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

这个让我困惑。 当我甚至没有打电话给我时,我得到一个关于寻求的错误?

我的代码看起来像这样:

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

stream的类型为System.IO.BufferedStream 。 可能会发生什么?

编辑更多信息:

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

编辑:

就是这样! 虽然可以在单个NetworkStream上进行读写,但在切换到BufferedStream ,必须有一个单独的用于读写。 显然,可以在同一个套接字上两次调用NetworkStream构造函数来获取它。

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

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

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


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

 if(this._writePos == 0) 

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

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

Read缓冲区是空的吗?

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

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

你必须早先从那个BufferedStream中读过。 它从NetworkStream获取其字节。 这些是单向的,您可以只读取或只写入它们,具体取决于它们的创建方式。 如果您需要更多帮助,请发布创建NetworkStream的代码。