El proyecto proporciona una clase de ayuda para la detección y notificación sobre la pérdida de paquetes no confiables. Esta es una parte importante de muchas estrategias de sincronización avanzadas. Por ejemplo, Eventual Consistency lo utiliza.
Para simplificar, el servidor admite solo un cliente.
Descripción general |
---|
La detección funciona agregando ese encabezado a cada paquete enviado:
ushort
ushort
ID de última secuencia remotauint
para 32 ID de secuencia remota anterioresEl flujo de trabajo es así:
AddPeer
en el asistenteAddHeaderForPeerId
EnqueueData
ReadHeaderOfPeerId
con élExecuteLostPackets
ClearHeader
RemovePeer
Si el paquete se considera perdido, significa que lo más probable es que se haya perdido. Cuando el paquete se considera llegado , significa que ha llegado con seguridad.
Se llamará ILossHandler.OnPacketLost
por cada paquete perdido Y por cada paquete que estaba en cola y aún rastreado cuando ese par se desconectó.
Si el símbolo LOSS_DETECTOR_DEBUG
está presente, todas las secuencias de paquetes perdidos se enviarán al registrador.
ILossHandler handler, ushort maxPeerCount, ushort ackWindow
): se llamará a esa implementación de ILossHandler
para cada paquete perdido. MaxPeerCount
: recuento máximo de pares conectados a ese par. AckWindow
: recuento máximo de paquetes rastreados localmente por par.ushort peerId
): borra el número de secuencia para ese peerId.ushort peerId
): pone en cola cada paquete rastreado para ese peerId como perdido.ushort peerId, BitBuffer data
): escribe información de encabezado en BitBuffer para ese peerId.ushort peerId, BitBuffer data
): lee el encabezado de BitBuffer y detecta si algún paquete rastreado tiene ACK o NACK. En el caso del detector ACK, se liberará la memoria asignada. Devuelve True si el ID de secuencia es mayor que el ID de última secuencia para ese ID de igual.ushort peerId, PacketData data
): intenta colocar datos en la cola de paquetes rastreados para ese par. Devuelve False si la cola ya está llena. Probablemente no haya recibido paquetes de otro interlocutor durante demasiado tiempo y debería desconectarlo.BitBuffer data
): borra el encabezado de BitBuffer. Si el símbolo LOSS_DETECTOR_DEBUG
está presente, esos métodos también están disponibles:
StringBuilder builder
): escribe el estado completo de los búferes para cada peerId en StringBuilder.ushort peerId, StringBuilder builder
): escribe el estado de los buffers para ese peerId. El asistente en sí es independiente del transporte, pero el proyecto de ejemplo usa ENet
fholm, el Máster en Networking, me ha ayudado mucho.