среда, 13 апреля 2011 г.

Пример работы с таймером (реализация таймаута)

Сегодня в проекты "echo_server" и "qt_echo_server" (т.к. у них общая кодовая база касаемо самого сервера) введена возможность указывать для сессий (на стороне сервера, конечно) таймаут чтения, по истечении которого сессия считается неактивной (по вине клиента - мол "упал он там что ли?").

При этом оставлена возможность не задавать величину подобного таймаута. В этом случае таймаут не будет использоваться вообще (это похоже на таймаут, равный +∞).

Отличительная возможность реализации таймаута - это использование custom memory allocation для обработчика, используемого совместно с deadline_timer-ом. Эта "фишка" потребовала особого дизайна (правда, не столь уж и "мудреного") и показала то, о чем не сказано ни в одном примере Boost.Asio. - см. комментарии - там есть ссылка на пост автора Asio, где очень подробно описано более простое (и понятное) решение. Кстати, это решение уже есть в офиц. документации Asio.

Код пока только в SVN-репозитории (trunk).
После проверки всеми компиляторами появится dev-release.

Updated 14.09.2011: см. улучшенный/исправленный вариант.

2 комментария:

Marat Abrarov комментирует...

Updated: в версии 0.2.4 таймаут чтения заменен на более логичный таймаут активности, который указывает максимальное время "неактивности" соединения ("активность" - это чтение или запись).

Marat Abrarov комментирует...

Updated: вариант реализации работы с таймером, предложенный в echo_server, несколько отличается от того, что опубликовал Chris.

Я намеренно "сузил" API, предоставляемый deadline_timer.

Во-первых, чтобы показать, что уже такого API достаточно (такой API, может позволить реализовать deadline_timer более эффективно).

Во-вторых, чтобы "сэкономить" на вызовах функций определения текущего времени, которые, вероятнее всего, представляют из себя вызовы API ОС, что уже само по себе накладно.