Проект предоставляет вспомогательный класс для обнаружения и уведомления о потере ненадежных пакетов. Это важная часть многих расширенных стратегий синхронизации. Например, его использует Eventual Consistency.
Для простоты сервер поддерживает только одного клиента.
| Обзор |
|---|
Обнаружение работает путем добавления этого заголовка к каждому отправленному пакету:
ushort Идентификатор локальной последовательностиushort Идентификатор последней удаленной последовательностиuint Битовая маска для 32 идентификаторов предыдущих удаленных последовательностейРабочий процесс такой:
AddPeer в помощникеAddHeaderForPeerIdEnqueueDataReadHeaderOfPeerId с нимExecuteLostPacketsClearHeaderRemovePeerЕсли пакет считается потерянным, это означает, что он, скорее всего, был потерян. Если пакет считается « Прибывшим» , то он наверняка доставлен.
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 - Мастер сетевых технологий - очень помог.