Вступить в клуб →
средняявопросСети в Linux: сокеты, epoll и Boost.Asio

С 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
  • Перевести сокет в блокирующий режим

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела