У меня нет точного ответа на то, что вы ищете, один из способов, который вы могли бы сделать, это создать с обеих сторон (как на клиенте, так и на сервере) пул пакетов, ожидающих свои ACK, с каждым пакетом в пуле, помеченном как время жизни .
Пакеты затем выбрасываются из пула, как только их ACK получены. Для пакетов, которые остаются в ожидании - пул наблюдает некоторым хранителем, который может быть синхронизирован глобальным таймером, и все, что делает хранитель, периодически уменьшает TTL для каждого пакета в пуле (скажем, каждый N тики). Пакеты, для которых ACK не пришли вовремя (TTL достигло 0), объявляются тайм-аутом и обработаны сокетами.