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 auxiliarAddHeaderForPeerIdEnqueueDataReadHeaderOfPeerId com eleExecuteLostPacketsClearHeaderRemovePeerSe 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.