Le projet fournit une classe d'assistance pour la détection et la notification des paquets perdus peu fiables. Il s'agit d'un élément important de nombreuses stratégies de synchronisation avancées. Par exemple, Eventual Consistency l’utilise.
Par souci de simplicité, le serveur ne prend en charge qu'un seul client.
Aperçu |
---|
La détection fonctionne en ajoutant cet en-tête à chaque paquet envoyé :
ushort
ushort
Identifiant de la dernière séquence distanteuint
Bitmask pour 32 identifiants de séquence distante précédentsLe flux de travail est le suivant :
AddPeer
dans l'assistantAddHeaderForPeerId
EnqueueData
ReadHeaderOfPeerId
avecExecuteLostPackets
ClearHeader
RemovePeer
Si le paquet est considéré comme perdu, cela signifie qu'il a probablement été perdu. Lorsque le paquet est considéré comme Arrived , il est arrivé avec certitude.
ILossHandler.OnPacketLost
sera appelé pour chaque paquet perdu ET pour chaque paquet qui a été mis en file d'attente et toujours suivi lorsque cet homologue a été déconnecté.
Si le symbole LOSS_DETECTOR_DEBUG
est présent, alors toutes les séquences de paquets perdues seront transmises à l'enregistreur.
ILossHandler handler, ushort maxPeerCount, ushort ackWindow
) - Cette implémentation de ILossHandler
sera appelée pour chaque paquet perdu. MaxPeerCount
- Nombre maximum de pairs connectés à ce pair. AckWindow
- Nombre maximum de paquets suivis locaux par homologue.ushort peerId
) - Efface le numéro de séquence pour ce peerId.ushort peerId
) - Met en file d'attente chaque paquet suivi pour ce peerId comme étant perdu.ushort peerId, BitBuffer data
) - Écrit les informations d'en-tête dans BitBuffer pour ce peerId.ushort peerId, BitBuffer data
) - Lit l'en-tête de BitBuffer et détecte si un paquet suivi est ACK ou NACK. Dans le cas du détecteur ACK, la mémoire allouée sera libérée. Renvoie True si séquenceId est supérieur à lastSequenceId pour ce peerId.ushort peerId, PacketData data
) - Essaie de placer les données dans la file d'attente des paquets suivis pour cet homologue. Renvoie False si la file d'attente est déjà pleine. Vous n'avez probablement pas reçu de paquets d'un autre homologue depuis trop longtemps et devriez le déconnecter.BitBuffer data
) - Efface l'en-tête de BitBuffer. Si le symbole LOSS_DETECTOR_DEBUG
est présent, alors ces méthodes sont également disponibles :
StringBuilder builder
) - Écrit l'état complet des tampons pour chaque peerId dans StringBuilder.ushort peerId, StringBuilder builder
) - Écrit l'état des tampons pour ce peerId. Helper lui-même est indépendant du transport, mais un exemple de projet utilise ENet
fholm - Le maître du réseautage - m'a beaucoup aidé.