لا يتلقى CSocket OnClose أو onReceive عند تعطيل اتصال الشبكة على جانب العميل

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

  •  19-09-2019
  •  | 
  •  

سؤال

لقد قمت بإنشاء تطبيق خادم العميل مع CSocket C ++. عندما أقوم بتوصيل العميل بالخادم وبعد أن أغلق العميل مع زر X عادي أو مهمة إنهاء TaskManager، يتلقى الخادم CSocket الحدث OnClose. المشكلة هي عندما أقوم بتعطيل اتصال الإنترنت على Windows أن العميل قيد التشغيل، لا يتلقى الخادم CSocket الحدث OnClose ولا OnReceive!

هل يمكن لأي شخص أن يعرف ما يحدث؟

تحديث: لقد اختبرت للتو ورأيت أن العميل لم يحصل على onclose أيضا! لقد قمت بتعطيل اتصال الإنترنت على Windows الذي يعمل العميل عليه!

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

المحلول

يقوم جانب العميل بإغلاق دون أن يتمكن من إغلاق الاتصال بالخادم عبر زعنفة أو RST. بالنسبة للخادم للكشف عن أن العميل قد مات، يجب أن يكون له إما بيانات لإرسال (والتي ستفشل) أو يجب إرسال تحقيقات حاجز TCP الدورية. TCP_KEEPALIVE يمكن تعيين كخيار مأخذ التوصيل.

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