سؤال

أحتاج إلى إجراء توقف ثلاثي الاتجاه وانتظار المصافحة بين تطبيقات العميل والخادم المكتوبة بلغة c++ (مع Winsock 2) لمهمة ما.يرسل العميل SYN.يقوم الخادم بزيادة الرقم التسلسلي للعميل ويرسل SYN-ACK.يقوم العميل بزيادة رقم تسلسل الخادم ويرسل ACK.

لمحاكاة فقدان الحزم، يتم توصيل العميل والخادم ببرنامج جهاز توجيه وسيط لا يقوم أحيانًا بإعادة توجيه الحزم، مما يتسبب في فقدانها.كيف يمكنني تنظيم عبارات sendto() وselect() وrecvfrom() الخاصة بي لحساب احتمال فقدان الحزمة؟

على سبيل المثال، إذا تم فقدان SYN وانتهت مهلة العميل، فأعد إرساله.في حالة فقدان SYN-ACK، تنتهي مهلة العميل ويعيد إرسال SYN.ليس لدي أي فكرة عما يجب فعله في حالة فقدان ACK.

يحرر: يتم الأمر بشكل أساسي على هذا النحو مع موكلي:

  • أرسل SYN.
  • قم بالتكرار أثناء فشل عبارة Select() ثم قم بإعادة إرسال SYN
  • تلقي SYN-ACK
  • إرسال تأكيد
  • قم بالتكرار لإعادة تلقي SYN-ACK في حالة فقد ACK.

كيف أعرف متى أتوقف عن التكرار؟

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

المحلول

select يمكن استخدامه للتحقق من إمكانية القراءة من المقبس دون حظر.

أما بالنسبة للتحقق من الحزمة المرسلة التي ينتمي إليها ACK، فعليك التحقق من الرقم التسلسلي.

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

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