2012-02-09 1 views
0

У меня есть существующая многопоточная программа на C++, которая использует пул сокетов для чтения и записи. Нить отправителя отправляет HTTP-запросы, используя следующий доступный сокет. Приемник therad проверяет пул сокетов (используя метод poll()) и считывает ответы HTTP. Как поток получателя может обнаружить возможный тайм-аут ответа HTTP из сокета пула?Тайм-аут ответа на сокет с использованием опроса

ответ

2

Быстрый пример с верхней части моей головы:

  1. при отправке запроса, создать объект, содержащий Fd, любую логическую информацию о соединении вам нужно, и абсолютное время, в которое вы будете рассматривать его тайм-аут
  2. сохранить приоритетную очередь этих объектов, упорядоченных по времени, так что скорейшее до истечения срока действия всегда на фронте (это вырождается в очередь FIFO, если все запросы получают одинаковый тайм-аут)
  3. при опросе, вычислить тайм-аут от сейчас до первого абсолютного времени в очереди
  4. Если опрос возвращает ноль (или только каждый раз, когда он просыпается), получите текущее время и проведите время в очереди на любые запросы, время ожидания которых в прошлом
  5. , когда вы получите успешный ответ, вам понадобится для удаления связанного объекта из очереди, а также
+0

Я планирую использовать poll(), чтобы поток получателя был навеки вечным и предупредил меня, когда данные готовы к приему. Есть ли способ получить событие с методом опроса, когда сокет истечет? – user292167

+0

Вы просто проходите опрос тайм-аута: когда он возвращает это _either_, потому что вы получили событие, _or_, потому что вы набрали таймаут. Код возврата скажет вам, какой. Сделайте это в цикле, и вы все еще эффективно ожидаете вечно, вы просто просыпаетесь и теряете время, когда ничего не происходит. – Useless

Смежные вопросы