سؤال

ما هي أسهل طريقة للتحقق مما إذا كان المقبس مغلقًا على الجانب البعيد من الاتصال؟ socket::is_open() يُرجع صحيحًا حتى لو كان مغلقًا على الجانب البعيد (أنا أستخدم boost::asio::ip::tcp::socket).

يمكنني أن أحاول القراءة من الدفق ومعرفة ما إذا كان الأمر ناجحًا، لكن يجب أن أغير منطق برنامجي لجعله يعمل بهذه الطريقة (لا أريد استخراج البيانات من الدفق عند نقطة التحقق ).

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

المحلول

وإذا كان الاتصال تم إغلاق نظيفة من قبل الأقران يجب أن تحصل على EOF أثناء القراءة. إلا أنني عموما بينغ من أجل معرفة إذا كان الاتصال هو على قيد الحياة حقا.

نصائح أخرى

وانظروا فقط للخطأ boost::asio::error::eof في معالج async_receive الخاص بك. وهذا يعني تم إغلاق الاتصال. هذا هو السبيل الوحيد المناسب للقيام بذلك.

هل هناك وظيفة نظرة خاطفة دفعة متاحة؟تحتوي معظم تطبيقات المقبس على طريقة لقراءة البيانات دون إزالتها من قائمة الانتظار، بحيث يمكنك قراءتها مرة أخرى لاحقًا.يبدو أن هذا يلبي متطلباتك.

بعد إلقاء نظرة سريعة على مستندات asio، لم أتمكن من العثور على ما كنت أتوقعه بالضبط، ولكن هذا لا يعني أنه غير موجود.

أود أن أقترح هذا للمبتدئين.

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

وعن طريق ERROR_CODE غير قادرة على التحقق من حالة ما إذا كان العميل متصلا أم لا. إذا كان الاتصال من النجاح، فإن error.value ERROR_CODE () بإرجاع 0، وإلا سيعود قيمة أخرى. يمكنك أيضا التحقق من رسالة () من ERROR_CODE.

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