โปรเจ็กต์จัดเตรียมคลาสตัวช่วยสำหรับการตรวจจับและการแจ้งเตือนเกี่ยวกับแพ็กเก็ตที่ไม่น่าเชื่อถือที่สูญหาย นี่เป็นส่วนสำคัญของกลยุทธ์การซิงโครไนซ์ขั้นสูงมากมาย ตัวอย่างเช่น ความสอดคล้องในที่สุดใช้มัน
เพื่อความง่าย เซิร์ฟเวอร์รองรับไคลเอนต์เดียวเท่านั้น
| ภาพรวม |
|---|
การตรวจจับทำงานโดยการเพิ่มส่วนหัวนั้นให้กับแต่ละแพ็กเก็ตที่ส่ง:
ushortushort รหัสลำดับระยะไกลล่าสุดuint Bitmask สำหรับรหัสลำดับระยะไกล 32 รายการก่อนหน้าขั้นตอนการทำงานเป็นดังนี้:
AddPeer ในตัวช่วยAddHeaderForPeerIdEnqueueDataReadHeaderOfPeerId ด้วยExecuteLostPacketsClearHeaderRemovePeerหากแพ็คเก็ตถูกพิจารณาว่า สูญหาย แสดงว่ามี แนวโน้มว่าจะสูญหายมากที่สุด เมื่อแพ็คเก็ตถือว่า มา ถึงแล้วอย่างแน่นอน
ILossHandler.OnPacketLost จะถูกเรียกสำหรับแต่ละแพ็กเก็ตที่สูญหาย และสำหรับแต่ละแพ็กเก็ตที่ถูกจัดคิวและยังคงติดตามเมื่อเพียร์นั้นถูกตัดการเชื่อมต่อ
หากมีสัญลักษณ์ LOSS_DETECTOR_DEBUG อยู่ ลำดับแพ็กเก็ตที่สูญหายทั้งหมดจะถูกส่งออกไปยังตัวบันทึก
ILossHandler handler, ushort maxPeerCount, ushort ackWindow ) - การใช้งาน ILossHandler นั้นจะถูกเรียกใช้สำหรับแต่ละแพ็กเก็ตที่สูญหาย MaxPeerCount - จำนวนเพื่อนสูงสุดที่เชื่อมต่อกับเพื่อนนั้น AckWindow - จำนวนแพ็กเก็ตที่ติดตามในเครื่องสูงสุดต่อเพียร์ushort peerId ) - ล้างหมายเลขลำดับสำหรับ peerId นั้นushort peerId ) - จัดคิวแต่ละแพ็กเก็ตที่ถูกติดตามสำหรับ peerId นั้นว่าสูญหายushort peerId, BitBuffer data ) - เขียนข้อมูลส่วนหัวลงใน BitBuffer สำหรับ peerId นั้นushort peerId, BitBuffer data ) - อ่านส่วนหัวจาก BitBuffer และตรวจสอบว่าแพ็กเก็ตที่ถูกติดตามใด ๆ ถูก ACKed หรือ NACKed หรือไม่ ในกรณีของตัวตรวจจับ ACK จะทำให้หน่วยความจำที่จัดสรรว่าง คืนค่า True หาก sequenceId มากกว่า LastSequenceId สำหรับ peerId นั้นushort peerId, PacketData data ) - พยายามใส่ข้อมูลลงในคิวแพ็กเก็ตที่ติดตามสำหรับเพียร์นั้น คืนค่าเท็จหากคิวเต็มแล้ว อาจเป็นไปได้ว่าคุณไม่ได้รับแพ็กเก็ตจากเพียร์อื่นนานเกินไปและควรยกเลิกการเชื่อมต่อเขาBitBuffer data ) - ล้างส่วนหัวจาก BitBuffer หากมีสัญลักษณ์ LOSS_DETECTOR_DEBUG แสดงว่าวิธีการเหล่านั้นก็ใช้ได้เช่นกัน:
StringBuilder builder ) - เขียนสถานะเต็มของบัฟเฟอร์สำหรับแต่ละ peerId ลงใน StringBuilderushort peerId, StringBuilder builder ) - เขียนสถานะของบัฟเฟอร์สำหรับ peerId นั้น ตัวช่วยเหลือเองนั้นไม่เชื่อเรื่องการขนส่ง แต่โปรเจ็กต์ตัวอย่างใช้ ENet
fholm - The Master of Networking - ช่วยได้มาก