#sockets #epoll #epollet
#сокеты #epoll #epollet
Вопрос:
В настоящее время у меня есть серверное приложение, которое поддерживает несколько клиентских сеансов. Сервер работает в режиме запуска границы epoll. Все сокеты, которые используются внутри сервера, по своей природе неблокирующие. Основной цикл epoll выглядит примерно так,
n = epoll_wait()
iterate over n
if event is epollin(assume client has written some data)
while(1)
drain the buffer untill you get EAGAIN
break
Проблема здесь возникает, когда данные непрерывно перетекают через буфер, а буфер никогда не истощается. Сервер не получает возможности развлекать другие сеансы.
Из-за этого возможного голода для других клиентов я подумываю об использовании режима запуска уровня, который позволяет серверу обрабатывать все активные сеансы циклическим способом.
Могу ли я просто использовать режим запуска уровня, удалив «EPOLLET» из подписанного события и прочитав данные буфера один раз (например, в режиме LT)?
Любые комментарии / ссылки приветствуются.
Спасибо!
Комментарии:
1. Я думаю, вы можете. Обычно я бы сам использовал режим по умолчанию (с запуском уровня). Вы пробовали это?
2. Да, я попробовал это, и, по крайней мере, для меня это работает так, как ожидалось.