なぜbufferedstream.writeスロー「このストリームはシーク操作をサポートしない」
-
29-09-2019 - |
質問
これは私を困惑させます。私がそれを呼んでいないとき、私は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
, 、aに切り替えるとき BufferedStream
読み書きのために別のものを用意する必要があります。どうやら電話することができます NetworkStream
コンストラクターは同じソケットで2回、それを取得します。
私はジャスティンとハンスの両方の答えを受け入れます。みんな、ありがとう!
解決
問題は、BufferedStreamの内側の仕組みにあります(そして、あなたがそれに書き込もうとする前にBufferedStreamを使用して読んだかもしれないという事実)。
バッファードストリームに書き込もうとすると、パラメーターを検証した後、この順序で物事がチェックされます(すべてのコードがReflectorを介してフレームワークから引き抜かれました):
私たちは書き込みバッファーの物ggingいをしていますか?
if(this._writePos == 0)
基礎となるストリームに書き込むことは許可されていますか?
if(!this._s.CanWrite) // throw error
読み取りバッファーは空ですか?
if(this._readPos < this._readLen)
{
// FlushRead() will attempt to call Seek()
this.FlushRead();
}
読み取りバッファーに未読データがある場合、書き込む前にフラッシュが試みられます。 flushread()calls seek()、 これがあなたのエラーを引き起こしているものです.
他のヒント
あなたはそのbufferedstreamから以前に読んでいたに違いありません。ネットワークストリームからバイトを取得しています。これらは一方通行であり、それらがどのように作成されたかに応じて、それらからのみ読むか、それらにのみ書き込むことができます。さらにヘルプが必要な場合は、ネットワークストリームを作成したコードを投稿してください。