C# 为什么BufferedStream.Write会抛出;此流不支持seek操作;?

C# 为什么BufferedStream.Write会抛出;此流不支持seek操作;?,c#,networkstream,bufferedstream,C#,Networkstream,Bufferedstream,这个让我困惑。我甚至都没打电话给seek的时候,它就出错了 我有这样的代码: // 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 operatio

这个让我困惑。我甚至都没打电话给seek的时候,它就出错了

我有这样的代码:

// 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
构造函数来获得它


如果可以的话,我会接受贾斯汀和汉斯的回答,因为一个让我准确地理解了问题所在,另一个让我找到了解决办法。谢谢大家

您以前一定是从该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();
}
if(this.\u readPos


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

如果有帮助,BufferedStream位于NetworkStream之上。您是如何声明缓冲流的,大小是多少?它与什么流类型关联?sizeof(uint)不应该是msg.length吗?您可能发现了一些问题:可能有另一个线程正在尝试同时读取,这就是问题所在。文档确实说,您可以从同一个BufferedStream读取和写入数据(在我的例子中,.CanRead和.CanWrite都是真的),但可能不能同时进行。如果我理解正确,您应该有两个NetworkStreams和两个BufferedStreams。从一个读到另一个写。@red:是的,BufferedStream支持读和写。但是它正在读取/写入的流可能不支持它。NetworkStream没有。我的代码在写的时候没有读——但Justin的回答表明,拥有未读数据就足以陷入麻烦(当然,我无法控制这一点)。是否有一种方法可以连接一次,但得到两个缓冲流?@red:打开以写入的网络流不会有未读数据。我会首先检查您是否使用了正确的NS。关注网络流,而不是BufferedStreamok,所以当存在未读数据时,我不能调用write。。。这基本上意味着我不能让一个线程在同一个BufferedStream上读另一个线程写。现在,假设我连接到另一台计算机时有一个网络流,如何从中获得两个缓冲流?@redtuna-如果这是你的目标,你将必须创建两个网络流来匹配这两个缓冲流。否则,您将在共享网络流中遇到一大堆问题。