Проект предоставляет вспомогательный класс для обнаружения и уведомления о потере ненадежных пакетов. Это важная часть многих расширенных стратегий синхронизации. Например, его использует Eventual Consistency.
Для простоты сервер поддерживает только одного клиента.
Обзор |
---|
Обнаружение работает путем добавления этого заголовка к каждому отправленному пакету:
ushort
Идентификатор локальной последовательностиushort
Идентификатор последней удаленной последовательностиuint
Битовая маска для 32 идентификаторов предыдущих удаленных последовательностейРабочий процесс такой:
AddPeer
в помощникеAddHeaderForPeerId
EnqueueData
ReadHeaderOfPeerId
с нимExecuteLostPackets
ClearHeader
RemovePeer
Если пакет считается потерянным, это означает, что он, скорее всего, был потерян. Если пакет считается « Прибывшим» , то он наверняка доставлен.
ILossHandler.OnPacketLost
будет вызываться для каждого потерянного пакета И для каждого пакета, который был поставлен в очередь и все еще отслеживался, когда этот одноранговый узел был отключен.
Если присутствует символ LOSS_DETECTOR_DEBUG
, то все потерянные последовательности пакетов будут выведены в регистратор.
ILossHandler handler, ushort maxPeerCount, ushort ackWindow
) — эта реализация ILossHandler
будет вызываться для каждого потерянного пакета. MaxPeerCount
— максимальное количество пиров, подключенных к этому узлу. AckWindow
— максимальное количество локальных отслеживаемых пакетов на одноранговое устройство.ushort peerId
) — очищает порядковый номер для этого PeerId.ushort peerId
) — ставит в очередь каждый отслеживаемый пакет для этого PeerId как потерянный.ushort peerId, BitBuffer data
) — записывает информацию заголовка в BitBuffer для этого PeerId.ushort peerId, BitBuffer data
) — считывает заголовок из BitBuffer и определяет, подтвержден ли какой-либо отслеживаемый пакет ACK или NACK. В случае ACK детектор освободит выделенную память. Возвращает значение True, если значение SequenceId больше, чем значение LastSequenceId для этого PeerId.ushort peerId, PacketData data
) — пытается поместить данные в очередь отслеживаемых пакетов для этого узла. Возвращает False, если очередь уже заполнена. Вероятно, вы слишком долго не получали пакеты от другого пира и вам следует его отключить.BitBuffer data
) — очищает заголовок из BitBuffer. Если присутствует символ LOSS_DETECTOR_DEBUG
, то эти методы также доступны:
StringBuilder builder
) — записывает полное состояние буферов для каждого PeerId в StringBuilder.ushort peerId, StringBuilder builder
) — записывает состояние буферов для этого PeerId. Сам помощник не зависит от транспорта, но пример проекта использует ENet.
fholm - Мастер сетевых технологий - очень помог.