В этом случае вы должны использовать собственный протокол, я могу подумать об этом
сначала у нас должен быть номер в наших пакетах, который помогает нам отслеживать то, что отправлено и получено, давайте назовем его PacketId,
отправитель отправляет пакет со своим уникальным идентификатором, сохраняет его и запускает таймер, ожидающий ACK, если ACK для этого определенного идентификатора был получен, он удаляется из очереди, и мы отправляем следующий пакет, если нет и переполнение таймера, этот пакет отправляется снова,
И последнее, что касается идентификатора, это то, что он должен увеличиваться на единицу для каждого пакета.
На принимающей стороне вы ожидаете только определенный идентификатор, допустим, что при запуске вы ожидаете идентификатор 0, любой другойполученный пакет игнорируется до тех пор, пока этот конкретный идентификатор не будет обнаружен, затем вы увеличиваете ожидаемый идентификатор на единицу и идете вперед.
Может быть случай, когда ACK потерян и сервер отправит обратно предыдущий пакет, поэтому вам следует также подтвердить эти пакетыдаже если они не ожидаются, и убедитесь, что не обрабатывали эти пакеты дважды.
Это базовая схема, которая пришла мне в голову, она только отправляет пакет за один раз, с небольшой настройкой, она может адаптироваться для отправки нескольких пакетов одновременно и ждать ACK