Re[2]: epoll
От: maks1180  
Дата: 06.12.22 15:37
Оценка:
M>>Вариант №1 вызываем epoll_ctl( EPOLLET + EPOLLIN+EPOLLOUT)
M>>не буду получать нотификацию EPOLLIN до следующих принятых данных, если прочитаю не всё что есть в сокете.
M>>Как понять, что я всё прочитал из сокета ?

V>чтение вернет данных меньше чем размер предоставленного под чтение буфера, либо чтение вернет ноль данных и диагностику EAGAIN (сокет неблокирующий)

В этом можно быть уверенным ? Не может быть так что вернёт меньше и ещё останется ?


M>>Какие ещё есть решения ?


V>Сделать адаптер из ET в LT.

V>За базовый — берем ET. Для записи — используем его как есть.
V>Для чтения — заводим дополнительный булевый флажок со смыслом "есть что читать", по умолчанию сброшен, при получении EPOLLIN — взводим, при неблокирующем чтении — если вычитано меньше данных нежели предоставленный под чтение буфер или вычитано 0 и выдана диагностика EAGAIN — сбрасываем. Чтение, естественно, неблокирующее, чтобы вместо блока был EAGAIN. Вот и все, булевый флажок в основном эквивалентен предикату "есть что читать", остается лишь малый кейс при котором это не так — если при очередном чтении было вычитано данных ровно под размер буфера и именно такое количество данных и было доступно.. Но, это легко отрулить.

Вопрос, что делать потом с эти флажком ? Заставить дочитать сокет до конца сейчас или после следующего вызова epoll_wait() ?

Я сейчас читаю всё до конца. Но мне не нравится такое решение — если будет клиент который шлёт много данных, я буду тратить на него много ресурсов и латентность приложения увеличится.
Я бы лучше читал по 8-32кб за 1 раз, потом epoll_wait() и снова читать то что недочитано. Мне кажетья таким способом латентность будет лучше, чем когда всё читать до конца.
===============================================
(реклама, удалена модератором)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.