لا يتلقى CSocket OnClose أو onReceive عند تعطيل اتصال الشبكة على جانب العميل
-
19-09-2019 - |
سؤال
لقد قمت بإنشاء تطبيق خادم العميل مع CSocket C ++. عندما أقوم بتوصيل العميل بالخادم وبعد أن أغلق العميل مع زر X عادي أو مهمة إنهاء TaskManager، يتلقى الخادم CSocket الحدث OnClose. المشكلة هي عندما أقوم بتعطيل اتصال الإنترنت على Windows أن العميل قيد التشغيل، لا يتلقى الخادم CSocket الحدث OnClose ولا OnReceive!
هل يمكن لأي شخص أن يعرف ما يحدث؟
تحديث: لقد اختبرت للتو ورأيت أن العميل لم يحصل على onclose أيضا! لقد قمت بتعطيل اتصال الإنترنت على Windows الذي يعمل العميل عليه!
المحلول
يقوم جانب العميل بإغلاق دون أن يتمكن من إغلاق الاتصال بالخادم عبر زعنفة أو RST. بالنسبة للخادم للكشف عن أن العميل قد مات، يجب أن يكون له إما بيانات لإرسال (والتي ستفشل) أو يجب إرسال تحقيقات حاجز TCP الدورية. TCP_KEEPALIVE
يمكن تعيين كخيار مأخذ التوصيل.