سؤال

وأنا الاستفادة من الطبقة TcpClient لتنفيذ اتصال telnet. ما لا نعرفه هو كيفية تحديد نهاية الاستجابة. ويبدو أنه بمجرد الملكية DataAvailable صحيح، وأنا أقرأ البيانات من تيار وDataAvailable ثم يتم تعيين مؤقتا إلى false بينما يتم شغل عازلة مع قطعة أخرى من البيانات ولكن أعتقد أن كل قراءة وتذهب بعيدا. كيف يمكنني التأكد من أن جميع استجابة وقراءتها؟

هل يمكن تقديم المشورة لي كيفية تغيير التعليمات البرمجية المتكررة أدناه لجعل هذا العمل بشكل صحيح. أنه يعمل بشكل صحيح عندما كنت التنقل خلال التعليمات البرمجية لأن هناك متسع من الوقت للاستجابة كاملة لاسترجاعها. نقدر مساعدتكم.

if (this.Stream.DataAvailable)
{
    readBuffer = new Byte[this.Client.ReceiveBufferSize];
    do
    {
        // read data
        bytes = this.Stream.Read(readBuffer, 0, readBuffer.Length);
        Thread.Sleep(10);
        responseData = String.Concat(responseData, System.Text.Encoding.ASCII.GetString(readBuffer, 0, bytes));

       } while (this.Stream.DataAvailable);

       allDataRead = true;
       break;
}
هل كانت مفيدة؟

المحلول

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

وبحلول يبدو من التطبيق الخاص بك يجب عليك أن تبحث عن خط يغذي تشير إلى نهاية الإرسال.

do    
{      
     bytes = this.Stream.Read(readBuffer, 0, readBuffer.Length);             
     responseData = String.Concat(responseData, System.Text.Encoding.ASCII.GetString (readBuffer, 0, bytes));       
} while (this.Stream.DataAvailable && !responseData.Contains("\n"));       

نصائح أخرى

وأنا لا أعتقد انها فكرة جيدة لاستخدام DataAvailable لهذا الغرض. نهاية ردكم هو كل ما يقوله البروتوكول الخاص بك هو عليه.

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

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

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

هل هذا اتصال telnet الفعلي، أي أنك الاتصال إلى ملقم Telnet أو "تلنت" هل يعني حقا "مأخذ TCP / IP؟

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

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