سؤال

باستخدام أ StreamWriter للكتابة إلى أ NetworkStream, ، و أ StreamReader لقراءة الرد.يقوم التطبيق بإرسال الأوامر وقراءة الاستجابات إلى خادم الأخبار.

كود مبسط (بدون معالجة الأخطاء، وما إلى ذلك):

tcpClient = new TcpClient();
tcpClient.Connect(Name, Port);

networkStream = tcpClient.GetStream();
serverReader = new StreamReader(networkStream, Encoding.Default);
serverWriter = new StreamWriter(networkStream, Encoding.ASCII) {
                     AutoFlush = true
                   };

// reads the server's response to the connect:  "200 news.newsserver.com"
// commenting out these lines doesn't solve the problem
while (serverReader.Peek() > -1) {
    serverReader.ReadLine();
}

serverWriter.WriteLine("authinfo user username");

// expect response "381 more authentication required", but code just blocks
string response = serverReader.ReadLine();

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

يمكنني تجنب تعليق التطبيق عن طريق تعيين حلقة مهلة باستخدام serverReader.Peek(), ، لكنني سأستقطع دائمًا المهلة؛لم أحصل على رد أبدًا.

إذا اتصلت بالخادم والمنفذ مباشرة وأدخلت الأوامر، أحصل على استجابة فورية.

إذا اتصلت serverWriter.Flush() صراحة، بدلا من استخدام AutoFlush الملكية، مازلت أحظر ولم أتلقى أي رد.

هل لديك أي أفكار لماذا لا أتلقى ردًا على الخادم باستخدام هذا الأسلوب؟

شكرًا!

تم الحل:

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

في الكود الذي تم تعليقه، كنت لا أزال أستخدم حلقة المهلة مع serverReader.Peek().تقوم Peek() دائمًا بإرجاع -1، على الرغم من وجود بيانات في المخزن المؤقت لقراءتها!!استبدال حلقة Peek() بمكالمة حظر لـ ReadLine() يحل مشكلتي.

لقد قمت بوضع حلقة المهلة في الأصل لأن التطبيق متعدد الخيوط، ولم أرغب في حظره.سيتعين علي إعادة النظر في هذه المشكلة ومعرفة كيف يمكنني حل توقيت مؤشر الترابط دون استخدام Peek().

شكرا لكم جميعا، إجابات جيدة!

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

المحلول 3

ورمز أعلاه <م> لا العمل بالنسبة لي، لذلك عدت وبناء على ذلك الرمز إلى الرمز الذي لن يجدي نفعا.

في التعليمات البرمجية التي توقف، كنت لا تزال تستخدم حلقة مهلة مع serverReader.Peek (). نظرة خاطفة () دوما بإرجاع -1، على الرغم من وجود بيانات في المخزن المؤقت للقراءة !! استبدال حلقة نظرة خاطفة () مع استدعاء حظر لريدلاين () يحل مشكلتي.

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

وبفضل كل شيء، إجابات جيدة!

نصائح أخرى

أشك في أنه StreamWriter تلك هي المشكلة...ولكن هناك طريقة بسيطة لمعرفة ذلك.تحميل واير شارك ونرى ما هو في الحقيقة القادمة والذهاب على الشبكة.هذه هي أبسط طريقة لمعرفة ما يحدث.

وحاول "authinfo اسم المستخدم المستخدم \ ص \ ن". يقول RFC يجب إنهاء أسطر الأوامر NNTP من قبل CR-LF.

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