С EPOLLET часть соединений зависает с непрочитанными данными
ev.events = EPOLLIN | EPOLLET;
epoll_ctl(ep, EPOLL_CTL_ADD, fd, &ev);
// ...
if (events[i].events & EPOLLIN) {
ssize_t n = read(fd, buf, 4096);
conn.feed(buf, n);
}
Клиенты, отправляющие запросы больше 4 КБ, зависают: ss показывает непрочитанные данные в очереди приёма сокета, но epoll_wait для этого дескриптора больше не возвращает события. Что исправить?
- Читать в цикле, пока read не вернёт EAGAIN
- Увеличить буфер чтения до 64 КБ
- Вызывать epoll_ctl с EPOLL_CTL_MOD после read
- Перевести сокет в блокирующий режим
