这一点让我很困惑。当我甚至没有调用它的时候,我得到了一个关于搜索的错误?
我的代码看起来像这样:
// 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构造函数两次即可实现。
如果可以的话,我会接受贾斯汀和汉斯的答案,因为其中一个让我准确地理解了哪里出了问题,而另一个则引导我找到了解决方案。谢谢大家!
发布于 2010-06-23 02:06:47
问题出在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(),就是导致错误的原因。
发布于 2010-06-23 01:57:28
您之前一定从该BufferedStream中阅读过。它是从NetworkStream获取字节的。这些都是单向的,您可以只读或只写,这取决于它们是如何创建的。如果需要更多帮助,请发布创建NetworkStream的代码。
https://stackoverflow.com/questions/3095640
复制相似问题