تم استلام البيانات الغريبة النادرة خارج النظام باستخدام Indy

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

سؤال

إننا نواجه مشكلة غريبة مع Indy10 حيث يتم عرض سلوتين كبيرتين (بضع مئات من الأحرف لكل منها) واحدة تلو الأخرى باستخدام TCP في الطرف الآخر مشتركا بشكل غريب. هذا يحدث بشكل غير منتظم للغاية.

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

تتم محمية الدعوة لإرسال الرسالة فعليا بواسطة قسم حرج حول المكالمة إلى طريقة WRITELN الخاصة ب Iohandler، وبالتالي فلا يمكن أن يكون ذلك ممكنا لهيتين لإرسالها في نفس الوقت. (نحن بعضنا البعض يتم تنفيذ القسم الحرج / العمل بشكل صحيح). هذه المشكلة تحدث نادرا جدا. الأعراض غريبة ... عندما نرسل السلسلة أ تليها String B وما تلقينا في الطرف الآخر (في المناسبات النادرة حيث لدينا فشل) هو القسم الزائد من السلسلة A بحد ذاته (بمعنى آخر, ، هناك LF في نهاية ذلك) تليها القسم الرائد من السلسلة A ثم السلسلة بأكملها ب تليها LF واحدة. لقد تحققنا من أن الممتلكات "مهلة" ليست صحيحة بعد القراءة الجزئية - سجلنا هذه الخاصية بعد كل قراءة إرجاع المحتوى. كما نعلم أنه لا توجد أحرف مضمنة LF في السلسلة، حيث نستبدل جميع الأحرف غير الأبجدية الرقمية بشكل صريح في السلسلة مع مسافات قبل إدوال LF وإرسالها.

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

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

هل لدى أي شخص أي أفكار مشرقة؟

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

المحلول

هل لديك خيارات قراءة متعددة من نفس المقبس في نفس الوقت على الطرف الاستقبال؟ حتى فقط للاستعلام عن الحالة المتصلة () يؤدي إلى حدوث قراءة. يمكن أن يسبب هذا مؤشرات الترابط متعددة لقراءة البيانات الواردة وتخزينها في Iohandler.inputbuffer في ترتيب عشوائي إذا كنت غير حريص.

نصائح أخرى

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

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

هل راجعت nagle. إعدادات Iohandler؟ كان لدينا مشكلة مماثلة تم إصلاحنا عن طريق تحديد usenagle إلى false. في حالتنا، كان إرسال واستقبال كميات كبيرة من البيانات في رشقات تنفجر بطيئة بسبب clagle clagle، لذلك ليس نفس موقفك.

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