O projeto fornece uma classe auxiliar para detecção e notificação sobre perda de pacotes não confiáveis. Esta é uma parte importante de muitas estratégias avançadas de sincronização. Por exemplo, Eventual Consistency o utiliza.
Para simplificar, o servidor suporta apenas um cliente.
Visão geral |
---|
A detecção funciona adicionando esse cabeçalho a cada pacote enviado:
ushort
ID de sequência localushort
Último ID de sequência remotauint
Bitmask para 32 IDs de sequência remota anterioresO fluxo de trabalho é assim:
AddPeer
no auxiliarAddHeaderForPeerId
EnqueueData
ReadHeaderOfPeerId
com eleExecuteLostPackets
ClearHeader
RemovePeer
Se o pacote for considerado perdido, significa que provavelmente foi perdido. Quando o pacote é considerado Chegado , então ele chegou com certeza.
ILossHandler.OnPacketLost
será chamado para cada pacote perdido E para cada pacote que foi enfileirado e ainda rastreado quando aquele peer foi desconectado.
Se o símbolo LOSS_DETECTOR_DEBUG
estiver presente, todas as sequências de pacotes perdidos serão enviadas para o registrador.
ILossHandler handler, ushort maxPeerCount, ushort ackWindow
) - Essa implementação de ILossHandler
será chamada para cada pacote perdido. MaxPeerCount
– Contagem máxima de peers conectados a esse peer. AckWindow
– Contagem máxima de pacotes locais rastreados por par.ushort peerId
) - Limpa o número de sequência desse peerId.ushort peerId
) - Enfileira cada pacote rastreado para esse peerId como sendo perdido.ushort peerId, BitBuffer data
) - Grava informações de cabeçalho no BitBuffer para esse peerId.ushort peerId, BitBuffer data
) - Lê o cabeçalho do BitBuffer e detecta se algum pacote rastreado foi ACKed ou NACKed. No caso do detector ACK, a memória alocada será liberada. Retorna True se sequenciaId for maior que lastSequenceId para esse peerId.ushort peerId, PacketData data
) - Tenta colocar dados na fila de pacotes rastreados para esse peer. Retorna False se a fila já estiver cheia. Provavelmente você não recebe pacotes de outro peer há muito tempo e deveria desconectá-lo.BitBuffer data
) - Limpa o cabeçalho do BitBuffer. Se o símbolo LOSS_DETECTOR_DEBUG
estiver presente, esses métodos também estarão disponíveis:
StringBuilder builder
) - Grava o estado completo dos buffers para cada peerId no StringBuilder.ushort peerId, StringBuilder builder
) - Grava o estado dos buffers para esse peerId. O próprio Helper é independente de transporte, mas o projeto de exemplo usa ENet
fholm – The Master of Networking – ajudou muito.