Потеря байтов на неблокирующем сокете, управляемом epoll, когда другая сторона пишет и закрывает - PullRequest
0 голосов
/ 13 октября 2009

У меня есть неблокирующий сокет, на который в данный момент подписан:

 ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP | EPOLLRDHUP| EPOLLET;

Он получает пару EPOLLIN, которые я читаю неблокирующими до EAGAIN, а затем я получаю HUP & RDHUP, иногда с несколькими байтами для чтения.

Другая сторона просто:

send(socket,960_bytes_buffer)
close(socket);

Я пытался использовать recv с msg_peek непосредственно в цикле событий как для эполлина, так и для близкого времени, и при добавлении полученных данных он не всегда получает 960, иногда только около 480 байт.

Работает нормально, не блокируя сокет или помещая в клиент режим сна (1) между отправкой и закрытием.

Для меня это больше проблема неблокирующих сокетов, чем связанных с epoll. Что-то простое, например, «nc -l -p port», получает правильное количество байтов.

1 Ответ

6 голосов
/ 14 октября 2009

Посмотрите на Последняя страница SO_LINGER, или: почему мой tcp ненадежен , которая хорошо объясняет, что происходит и как это исправить.

...