なぜbufferedstream.writeスロー「このストリームはシーク操作をサポートしない」

StackOverflow https://stackoverflow.com/questions/3095640

質問

これは私を困惑させます。私がそれを呼んでいないとき、私は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から以前に読んでいたに違いありません。ネットワークストリームからバイトを取得しています。これらは一方通行であり、それらがどのように作成されたかに応じて、それらからのみ読むか、それらにのみ書き込むことができます。さらにヘルプが必要な場合は、ネットワークストリームを作成したコードを投稿してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top