Установка нескольких таймеров для связи через сокет C - PullRequest
0 голосов
/ 05 января 2012

Я столкнулся с ситуацией, связанной с поддержкой нескольких таймеров в моей программе обмена сокетами на языке Си.У меня есть клиент-серверная программа, в которой и клиент, и сервер должны поддерживать таймер для каждого пакета, отправляемого на другую машину.Протокол, которым я являюсь, работает следующим образом: каждый пакет, который отправляет машина A, машина B должна подтвердить то же самое в определенное время.Таким образом, таймер должен быть там для каждого пакета, который посылает машина А.Если таймер определяет тайм-аут, соединение с сокетом должно закрыться.Таким образом, мне нужно поддерживать таймеры для каждого пакета.Время ожидания одинаково для всех пакетов.Я хочу узнать, есть ли в C какие-либо условия для установки различных таймеров и различения их для достижения вышеуказанной функциональности.

Ответы [ 2 ]

1 голос
/ 05 января 2012

Вместо нескольких таймеров у вас может быть один таймер и очередь «событий».Очередь упорядочена по времени событий.Поэтому, когда вы отправляете пакет, просто добавьте событие отключения в очередь событий и сохраните некоторый идентификатор для этого события.Если вы получили ответ до того, как событие сработало, удалите его из очереди.

0 голосов
/ 05 января 2012

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

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

...