لماذا يعتقد BufferedStream.write "هذا الدفق لا يدعم عمليات البحث"؟

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

سؤال

هذا واحد يعززني. أحصل على خطأ في البحث عندما لا أسميه حتى؟

لدي رمز يبدو مثل هذا:

// 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 ، بعد التحقق من صحة المعلمات الخاصة بك ، يتم فحص الأشياء في هذا الطلب (جميع التعليمات البرمجية التي تم سحبها من الإطار عبر 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 () ، وهو ما يسبب خطأك.

نصائح أخرى

يجب أن تكون قد قرأت في وقت سابق من هذا المخزن المؤقت. إنه يحصل على بايت من شبكات. هذه في اتجاه واحد ، يمكنك إما القراءة فقط من أو تكتب إليهم فقط ، اعتمادًا على كيفية إنشائها. انشر الكود الذي أنشأ NetworkStream إذا كنت بحاجة إلى مزيد من المساعدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top