هل القراءة من telnet تيار إلى صفيف بايت انتظر حتى صفيف بايت هو الكامل ؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

من قراءة بعض الأسئلة والأجوبة هنا ، يبدو أن telnet تيار لم يغلق.باستخدام DataAvailable() لن يعود.

لقد ورثت بعض التعليمات البرمجية التي أخذت وقتا طويلا جدا جدا لإكمال كنا نظن أنه كان ملقم telnet كانت تلك المشكلة.ومع ذلك ، هناك بايت[32757] الذي رمز يحاول تخزين استجابة من ملقم telnet في.

شيء كما يلي:

Byte byteArray[] = new Byte[32757];
TcpClient sock = new TcpClient();
sock.GetStream().read(byteArray, 0 byteArray.length);

إذا لم يكن هناك 32757 بايت أو أكثر ، أفترض أن هذا رمز ينتظر حتى فارغة كافية يتم إرسال الحزم إلى جعل حجم صفيف بايت.هل هذا صحيح ؟

هل هناك طريقة للتحقق مما إذا كان ملقم telnet الانتهاء من إرسال كل ما يريد ؟ لا يوجد مرئية إنهاء شار أو سلسلة في كل صفحة من جلسة عمل telnet.

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

اقتراحات ؟

هل كانت مفيدة؟

المحلول

لا ، Stream.Read لا عموما انتظر حتى يتم قراءة كل شيء ، و أنه حتى أقل احتمالا للحصول على تيار الشبكة.فإنه سيتم قراءة كل ما تتوفر بيانات ، أو منع حتى هناك بعض البيانات المتاحة ، ولكن هذا كل شيء.

لا يوجد مفهوم حقيقي الخادم "التشطيب" إرسال ما انها سوف ترسل إلا إما:

  • أ) فإنه يقول لك مقدما كم انها سوف ترسل
  • ب) فإنه يشير إلى عندما يتم الانتهاء من ذلك مع نوع من إنهاء البيانات
  • ج) أنه يغلق الاتصال

قد ترغب في استخدام جهاز توقيت من نوع إلى تحقيق تأثير "استمر في القراءة حتى واحد من يقرأ يأخذ أكثر من 5 ثوان".علما بأن قراءة سيظل يحدث لو - كنت مجرد اختيار هذا الوقت إلى تحديث واجهة المستخدم (أو أيا كان).إنه موضوع صعب و كنت حقا بحاجة إلى أن تكون جدا واضحة في عقلك (ومستندات!) ماذا تريد أن تفعل ، والتي الموضوع سوف تحمل ما.

البديل هو وضع قراءة مهلة على TcpClient, ولكن ليس لدي الخبرة في ذلك.ربما تحتاج فقط إلى استخدام TcpClient.ReceiveTimeout ومن ثم معالجة الناتج IOException بشكل مناسب عند القراءة, ولكن ليس لدي أي نصيحة تقدم على ذلك.

نصائح أخرى

وبالإضافة إلى جون Skeets تفسير قليلا نصيحة:

ومنذ تلنت هو بروتوكول يستند إلى نص (خط)، والقراءة في البايت [] يعني سيكون لديك لإعادة تجميع النص. عليك أن تكون أفضل حالا مع TextReader:

System.IO.TextReader reader = new System.IO.StreamReader(
           sock.GetStream(), Encoding.ASCII);
string line;
while ((line = reader.ReadLine()) != null)  ...;

وانا التخمين هنا أن تلنت يستخدم ASCII.

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