9

这让我很困惑。当我什至没有调用它时,我得到一个关于 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,但在切换到 aBufferedStream时,必须有一个单独的用于读写。显然可以NetworkStream在同一个套接字上调用构造函数两次来获得它。

如果可以的话,我会同时接受贾斯汀和汉斯的回答,因为一个让我完全理解出了什么问题,另一个让我找到了解决方案。感谢大家!

4

2 回答 2

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(),这是导致您的错误的原因

于 2010-06-22T18:06:47.320 回答
4

您之前一定是从那个 BufferedStream 中读到的。它从 NetworkStream 中获取字节。这些是单向的,您只能读取或写入它们,具体取决于它们的创建方式。如果您需要更多帮助,请发布创建 NetworkStream 的代码。

于 2010-06-22T17:57:28.430 回答