Вам необходимо самостоятельно отслеживать оставшиеся тайм-ауты и передать минимальный тайм-аут на select()
.
Например, предположим, что вы не хотите, чтобы в сокете прослушивания было время ожидания и время ожидания для каждого соединения составляет 10 минут (время ожидания = 600 секунд). Для каждого соединения отслеживайте время последней активности в этом сокете в секундах, например:
socket last activity
1 1950
2 1990
3 1500
4 1998
Оставшееся время ожидания для каждого сокета может быть рассчитано как last + timeout - curtime
, поэтому, если текущее время равно 2000 (секундам), оставшееся время ожидания для каждого соединения составляет 550, 590, 100 и 598 соответственно. Минимум из них равен 100, так что в следующий раз вы будете иметь условие тайм-аута в отсутствие другой активности, поэтому передайте его функции select()
. Если время ожидания select()
истекло, тогда, когда вы пересчитаете оставшееся время ожидания для каждого сокета, вы обнаружите, какие сокеты истекли.