يوفر المشروع فئة مساعدة للكشف عن الحزم غير الموثوقة المفقودة والإبلاغ عنها. يعد هذا جزءًا مهمًا من العديد من استراتيجيات المزامنة المتقدمة. على سبيل المثال، يستخدمه الاتساق النهائي.
للتبسيط، يدعم الخادم عميلًا واحدًا فقط.
ملخص |
---|
يعمل الاكتشاف عن طريق إضافة هذا الرأس إلى كل حزمة مرسلة:
ushort
ushort
معرف التسلسل البعيد الأخيرuint
Bitmask لمعرفات التسلسل البعيد السابقة البالغ عددها 32 معرفًاسير العمل هو مثل هذا:
AddPeer
في المساعدAddHeaderForPeerId
EnqueueData
ReadHeaderOfPeerId
معهاExecuteLostPackets
ClearHeader
RemovePeer
إذا تم اعتبار الحزمة مفقودة ، فهذا يعني أنها فقدت على الأرجح . عندما تعتبر الحزمة وصلت ، فهذا يعني أنها وصلت بالتأكيد.
سيتم استدعاء ILossHandler.OnPacketLost
لكل حزمة مفقودة ولكل حزمة تم وضعها في قائمة الانتظار ولا يزال يتم تتبعها عند قطع اتصال هذا النظير.
في حالة وجود رمز LOSS_DETECTOR_DEBUG
، سيتم إخراج جميع تسلسلات الحزم المفقودة إلى المسجل.
ILossHandler handler, ushort maxPeerCount, ushort ackWindow
) - سيتم استدعاء تطبيق ILossHandler
لكل حزمة مفقودة. MaxPeerCount
- الحد الأقصى لعدد الأقران المتصلين بهذا النظير. AckWindow
- الحد الأقصى لعدد الحزم المحلية المتعقبة لكل نظير.ushort peerId
) - يمسح الرقم التسلسلي لمعرف النظير هذا.ushort peerId
) - يضع كل حزمة متعقبة لمعرف النظير هذا على أنها مفقودة.ushort peerId, BitBuffer data
) - يكتب معلومات الرأس في BitBuffer لمعرف النظير هذا.ushort peerId, BitBuffer data
) - يقرأ الرأس من BitBuffer ويكتشف ما إذا كانت أي حزمة متعقبة قد تم ACKed أو NACKed. في حالة كاشف ACK سوف يحرر الذاكرة المخصصة. تُرجع True إذا كان معرف التسلسل أكبر من lastSequenceId لمعرف النظير هذا.ushort peerId, PacketData data
) - يحاول وضع البيانات في قائمة انتظار الحزمة المتعقبة لذلك النظير. إرجاع خطأ إذا كانت قائمة الانتظار ممتلئة بالفعل. من المحتمل أنك لم تتلق حزمًا من نظير آخر لفترة طويلة ويجب عليك فصله.BitBuffer data
) - يمسح الرأس من BitBuffer. إذا كان رمز LOSS_DETECTOR_DEBUG
موجودًا، فهذه الطرق متاحة أيضًا:
StringBuilder builder
) - يكتب الحالة الكاملة للمخازن المؤقتة لكل معرف نظير في StringBuilder.ushort peerId, StringBuilder builder
) - يكتب حالة المخازن المؤقتة لمعرف النظير هذا. برنامج Helper نفسه لا يعتمد على النقل، لكن مثال المشروع يستخدم ENet
فولم - سيد الشبكات - ساعدنا كثيرًا.