Das Projekt stellt eine Hilfsklasse zur Erkennung und Benachrichtigung über verlorene unzuverlässige Pakete bereit. Dies ist ein wichtiger Bestandteil vieler fortgeschrittener Synchronisationsstrategien. Beispielsweise wird es von Eventual Consistency verwendet.
Der Einfachheit halber unterstützt der Server nur einen Client.
Überblick |
---|
Die Erkennung funktioniert durch das Hinzufügen dieses Headers zu jedem gesendeten Paket:
ushort
Lokale Sequenz-IDushort
Letzte Remote-Sequenz-IDuint
Bitmaske für 32 vorherige Remote-Sequenz-IDsDer Arbeitsablauf ist so:
AddPeer
im Hilfsprogramm aufAddHeaderForPeerId
aufEnqueueData
aufReadHeaderOfPeerId
aufExecuteLostPackets
aufClearHeader
aufRemovePeer
aufWenn das Paket als verloren gilt, bedeutet dies, dass es höchstwahrscheinlich verloren gegangen ist. Wenn das Paket als angekommen gilt, ist es mit Sicherheit angekommen.
ILossHandler.OnPacketLost
wird für jedes verlorene Paket UND für jedes Paket aufgerufen, das in die Warteschlange gestellt und noch verfolgt wurde, als die Verbindung zu diesem Peer getrennt wurde.
Wenn das Symbol LOSS_DETECTOR_DEBUG
vorhanden ist, werden alle verlorenen Paketsequenzen an den Logger ausgegeben.
ILossHandler handler, ushort maxPeerCount, ushort ackWindow
) – Diese Implementierung von ILossHandler
wird für jedes verlorene Paket aufgerufen. MaxPeerCount
– Maximale Anzahl der mit diesem Peer verbundenen Peers. AckWindow
– Maximale Anzahl lokal verfolgter Pakete pro Peer.ushort peerId
) – Löscht die Sequenznummer für diese PeerId.ushort peerId
) – Stellt jedes verfolgte Paket für diese PeerId als verloren ein.ushort peerId, BitBuffer data
) – Schreibt Header-Informationen für diese PeerId in BitBuffer.ushort peerId, BitBuffer data
) – Liest den Header von BitBuffer und erkennt, ob ein verfolgtes Paket ACKed oder NACKed ist. Im Fall von ACK gibt der Detektor zugewiesenen Speicher frei. Gibt True zurück, wenn sequenceId größer als lastSequenceId für diese PeerId ist.ushort peerId, PacketData data
) – Versucht, Daten in die Warteschlange für verfolgte Pakete für diesen Peer zu stellen. Gibt False zurück, wenn die Warteschlange bereits voll ist. Wahrscheinlich haben Sie zu lange keine Pakete von einem anderen Peer erhalten und sollten die Verbindung zu ihm trennen.BitBuffer data
) – Löscht den Header aus BitBuffer. Wenn das Symbol LOSS_DETECTOR_DEBUG
vorhanden ist, sind auch diese Methoden verfügbar:
StringBuilder builder
) – Schreibt den vollständigen Zustand der Puffer für jede Peer-ID in StringBuilder.ushort peerId, StringBuilder builder
) – Schreibt den Status der Puffer für diese PeerId. Der Helfer selbst ist transportunabhängig, das Beispielprojekt verwendet jedoch ENet
fholm – der Meister des Networking – hat sehr geholfen.