这个让我困惑。当我甚至没有打电话时,我收到关于寻找的错误?
我的代码看起来像这样:
// 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
构造函数两次即可。
如果可以的话,我会接受贾斯汀和汉斯的答案,因为一个让我完全理解错误,另一个让我找到解决方案。谢谢大家!
答案 0 :(得分:9)
问题在于BufferedStream的内部工作方式(以及您在尝试写入之前可能已使用BufferedStream进行读取的事实。)
当您尝试写入BufferedStream时,在验证参数后,将按此顺序检查事物(所有代码都通过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(),这是导致错误的原因。
答案 1 :(得分:4)
你必须早先从那个BufferedStream中读过。它从NetworkStream获取其字节。这些是单向的,您可以只读取或只写入它们,具体取决于它们的创建方式。如果您需要更多帮助,请发布创建NetworkStream的代码。