В настоящее время у меня есть неблокирующий сокет:
ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP | EPOLLRDHUP| EPOLLET;
Он получает пару EPOLLIN, которые я читаю без блокировки до EAGAIN, а затем я получаю HUP и RDHUP, иногда с еще несколькими байтами для чтения.
Другая сторона просто:
send(socket,960_bytes_buffer)
close(socket);
Я пробовал recv с msg_peek непосредственно в цикле событий как для epollin, так и для близкого времени, и добавляя полученные данные, он не всегда получает 960, иногда только около 480 байт.
Создание неблокирующего сокета или установка режима сна (1) в клиенте между отправкой и закрытием работает нормально.
Мне кажется, это больше проблема неблокирующих сокетов, чем проблема, связанная с epoll. Что-то простое, например «nc -l -p port», получает нужное количество байтов.