9

これは私を困惑させます。呼び出していないのにシークについてエラーが発生しますか?

私は次のようなコードを持っています:

// 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)

編集:

それでした!1つので読み取りと書き込みを行うことができますがNetworkStream、に切り替えるときBufferedStreamは、読み取りと書き込み用に別のを用意する必要があります。どうやらNetworkStream、同じソケットでコンストラクターを2回呼び出すだけで、それを取得できるようです。

可能であれば、ジャスティンとハンスの両方の回答を受け入れます。一方が私に何が悪かったのかを正確に理解させ、もう一方が私を解決策に導いたからです。みんな、ありがとう!

4

2 に答える 2

9

問題は、BufferedStreamの内部動作にあります(そして、書き込みを試みる前に、BufferedStreamを使用して読み取りを行った可能性があるという事実)。

BufferedStreamに書き込もうとすると、パラメーターを検証した後、次の順序でチェックされます(すべてのコードはReflectorを介してフレームワークから取得されます)。


私たちは書き込みバッファを物乞いしていますか?

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 に答える