2010-06-22 125 views
8

这个让我感到困惑。当我甚至没有打电话时,我遇到了关于寻找的错误?为什么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) 
... 

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

编辑更多信息:

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

编辑:

这就是它!虽然人们可以在一个NetworkStream上进行读写操作,但在切换到BufferedStream时,必须有一个单独的读写器。显然,只需在同一个套接字上调用两次构造函数NetworkStream即可。

如果可以的话,我会接受贾斯汀和汉斯的答案,因为一个让我明白了什么是错的,另一个让我找到解决方案。感谢大家!

+0

如果有帮助,BufferedStream位于NetworkStream之上。 – redtuna 2010-06-22 17:53:24

+0

你怎么声明缓冲流和什么大小?它与哪种流类型相关联?并且不应该sizeof(uint)是msg.length? – 2010-06-22 17:59:39

回答

9

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

当您尝试写一个BufferedStream,验证您的参数之后,事情的顺序进行检查(所有的代码通过反射框架拉):


我们是在写的乞讨缓冲?

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(),这是什么导致你的错误

+0

好吧,所以我不能在有未读数据时调用写入......这意味着我不能有一个线程读取,而另一个写入同一个BufferedStream。现在,考虑到当我连接到另一台计算机时我有一个NetworkStream,我如何从中获取两个BufferedStreams? – redtuna 2010-06-22 18:21:23

+0

@redtuna - 如果这是您的目标,您将不得不创建两个NetworkStream来匹配两个BufferedStream。否则,你会遇到与共享NetworkStream有关的大量问题。 – 2010-06-22 18:30:30

+0

谢谢@Justin。 – redtuna 2010-06-22 20:14:01

4

你一定早就读过BufferedStream。它从NetworkStream获取它的字节。这些是单向的,你可以只读或只写信给他们,这取决于他们是如何创建的。如果您需要更多帮助,请发布创建NetworkStream的代码。

+0

你可能会想:另一个线程可能同时尝试读取,这就是问题所在。文档确实说你可以从同一个BufferedStream读取和写入(在我的情况下,.CanRead和.CanWrite都是真实的),但可能不是同一时间。 – redtuna 2010-06-22 18:07:00

+0

你应该有两个NetworkStreams和两个BufferedStreams,如果我正确理解这个点。从一个阅读并写入另一个。 – 2010-06-22 18:11:09

+0

@red:是的,BufferedStream支持读写。但是它正在读/写的流可能不支持它。 NetworkStream不。 – 2010-06-22 18:21:26

相关问题