โปรเจ็กต์จัดเตรียมคลาสตัวช่วยสำหรับการตรวจจับและการแจ้งเตือนเกี่ยวกับแพ็กเก็ตที่ไม่น่าเชื่อถือที่สูญหาย นี่เป็นส่วนสำคัญของกลยุทธ์การซิงโครไนซ์ขั้นสูงมากมาย ตัวอย่างเช่น ความสอดคล้องในที่สุดใช้มัน
เพื่อความง่าย เซิร์ฟเวอร์รองรับไคลเอนต์เดียวเท่านั้น
ภาพรวม |
---|
การตรวจจับทำงานโดยการเพิ่มส่วนหัวนั้นให้กับแต่ละแพ็กเก็ตที่ส่ง:
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
) - ล้างหมายเลขลำดับสำหรับ 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 - ช่วยได้มาก