Можно ли использовать неблокирующие сокеты в режиме запуска уровня epoll?

#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. Да, я попробовал это, и, по крайней мере, для меня это работает так, как ожидалось.