Как реализовать тайм-аут epoll? - PullRequest
3 голосов
/ 06 июля 2011

Я работаю над сетевым программированием с использованием epoll.Кажется, работает нормально.Я хотел бы добавить функцию тайм-аута, так что если клиент не отправляет ничего в течение длительного периода времени, он просто отключит клиента.

Как мне это сделать?Я знаю, что могу установить время ожидания в epoll_wait, но это не для отдельного сокета ...

Заранее спасибо ...

Ответы [ 3 ]

9 голосов
/ 06 июля 2011

Сохранение списка сокетов, отсортированного по времени, оставшемуся до истечения времени ожидания (если период ожидания одинаков для всех сокетов, то это эквивалентно сортировке их по времени последнего полученного сообщения). Каждый раз, когда вы звоните epoll_wait(), выбирайте сокет с наименьшим оставшимся временем до истечения времени ожидания (которое будет находиться в начале вашего списка). Используйте это время как время ожидания в epoll_wait().

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


В epoll_wait() время:

timeout = expirylist->expire_time - current_time();
n_events = epoll_wait(epfd, events, maxevents, timeout);

handle_events(events, n_events);

for (client = expirylist; client != NULL && client->expire_time < current_time(); client = client->expire_next)
{
    do_timeout(client);
}
2 голосов
/ 06 июля 2011

Вы можете создать повторяющийся timerfd и добавить его в свой набор epoll.Он разбудит вас как угодно часто, и в этот момент вы сможете проверить все ваши клиентские соединения и отбросить те, которые вы считаете устаревшими.

Если ваш Linux слишком стар для поддержки timerfd, вы можете попробовать более старыйtimer_create.

0 голосов
/ 06 июля 2011

Просто используйте libevent * или подобное; это сэкономит усилия на реализации ваших собственных очередей и проверке таймаутов. Это также может упростить вам использование epoll, и в качестве дополнительного преимущества это будет несколько более переносимым (скажем, вы хотите запустить свое приложение на FreeBSD, у которого нет epoll, но есть что-то концептуально похожее, называемое kqueue)

* доступны другие похожие библиотеки.

...