كيف ينبغي للمرء أن هدم دفعة::اسيو::ip::udp::المقبس?

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

  •  10-07-2019
  •  | 
  •  

سؤال

لقد قرأت دفعة اسيو مرجع ذهبت من خلال البرنامج التعليمي وبدا في بعض الأمثلة.لا يزال, أنا غير قادر على رؤية كيف مأخذ ينبغي هدمه:

  1. يجب أن أتصل close() أو يتم ذلك عن طريق المقبس هو المدمر?
  2. متى يجب استدعاء إيقاف التشغيل()
  3. ما هي الآثار المترتبة على إيقاف التشغيل()?أنا على علم أن "تعطيل يرسل أو يتلقى", ولكن كيف يتم ذلك ؟ ماذا يمكن أن أتوقع لو إرسال أو تلقي باستخدام مقبس بعد أن تم تعطيل ؟
  4. الأخطاء التي يمكن أن أتوقع من قريب()
هل كانت مفيدة؟

المحلول

لأن هذا هو موضوع السؤال ، سوف أبذل قصارى جهدي للرد على كل جزء إلى الارتياح الخاص بك:

1) لقد كانت تجربتي مع اسيو مآخذ أن المدمر مقابض إغلاق مأخذ التوصيل.ومع ذلك, لقد تعاملت مع TCP sockets.أفضل طريقة للتحقق من هذا أن مجرد إلقاء نظرة على الكود المدمر لمعرفة ما إذا كان لا شيء يشبه قريبة.وأنا أعلم أن دفعة رمز يمكن أن تكون صعبة قليلا على المشي من خلال ذلك أنه قد يكون من الأسهل ببساطة إنشاء عينة صغيرة البرنامج الذي يفتح UDP socket ثم ويدمر ذلك.بهذه الطريقة يمكنك التنقل خلال التعليمات البرمجية في مصحح أخطاء إلى اتباع المنطق.

منذ المصممين دفعة أخذ هذا بعين الاعتبار TCP sockets لدي الوقت الصعب تخيل أنها لن تفعل الشيء نفسه بالنسبة UDP مآخذ.

2) دعوة shutdown() فقط عندما كنت تشعر بأنه من الضروري منع أي رمز من أداء المستقبل recv و/أو send على مأخذ التوصيل.انها ليست عادة المطلوب ، على الرغم من أنني قد رأيت ذلك تستخدم TCP sockets إلى قوة مأخذ إرسال RST عندما يتم إغلاق (بدلا من الافتراضي "رشيقة" إيقاف التشغيل حيث ريثما يرسل تتم معالجتها).

3) يمكنك التفكير في مآخذ كما يجري اثنين من قناة شكل من أشكال الاتصال:واحد للقراءة الأخرى الإرسال.يمكنك إيقاف أي واحد مستقل عن الآخر ، يمكنك الاستمرار في استخدام قناة واحدة عندما يتم إيقاف (أييمكنك لا تزال تتلقى بعد اغلاق لمدة إرسال والعكس بالعكس).إغلاق المقبس غير مطابقة الدعوة الاغلاق على كل recv وإرسالها.

اغلاق لمدة recv ببساطة يمنع رمز من قراءة أي بيانات أكثر.إذا كنت تحاول أن تفعل ذلك, سوف تحصل على خطأ مأخذ توصيل.وبالمثل ، إذا كان الجانب الآخر من محاولات الاتصال لإرسال البيانات ، وسوف تتلقى خطأ (آسف على التحول إلى TCP العالم مرة أخرى ، ولكن أعتقد أن RST يحصل أجاب مرة أخرى إلى المرسل).

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

4) سيكون لديك للتحقق من المستندات الخاصة بك إلى معرفة معينة. MSDN سوف تعطيك إشارة جيدة, على الرغم من أنني لا أعرف أن كنت أعتبر أن تكون موثوقة.

نصائح أخرى

من الأمثلة الواردة في تعزيز الموقع ، يبدو كما لو كان يجب عليك ببساطة استخدام close().على سبيل المثال, أنظر هذا واحد:

void connection::stop()
{
  socket_.close();
}

يؤخذ من هذا العنوان: خادم HTTP

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