这让我感到困惑。当我什至不打电话时,我会遇到一个错误吗?

我的代码看起来像这样:

// 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时,在验证您的参数后,按照此顺序检查事物(所有代码都通过反射器从框架中取出):


我们是在写缓冲区的乞讨吗?

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

其他提示

您一定是从那个BufferedStream开始阅读的。它正在从网络流中获取其字节。这些是单向的,您只能根据它们的创建方式来阅读或只写信给它们。如果您需要更多帮助,请发布创建NetworkStream的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top