LINUX.ORG.RU

История изменений

Исправление i-rinat, (текущая версия) :

почему и при блокирующих и при неблокирующих сокетах при величине BUFF_DOWNLOAD_SIZE 1024 мы не докачиваем файл?

Читаешь 1024 байта, а потом ждёшь, что epoll тебя ещё событие пришлёт, при этом запросив edge-triggered. Если на момент чтения в буфере сокета накопилось данных больше, чем 1024 байта, после одного read() данные там останутся. И epoll может тебе больше никогда не сгенерировать событие. Если ты читаешь больше байт за раз, ниже вероятность того, что данные останутся после этого одного read().

Итого: читать нужно, пока read() не вернёт тебе -1, с errno=EAGAIN или 0.

А ещё код у тебя чудной. Ты из какой кладовки bzero() и bcopy() откопал? Их ещё в 2001 году объявили устаревшими.

Исходная версия i-rinat, :

почему и при блокирующих и при неблокирующих сокетах при величине BUFF_DOWNLOAD_SIZE 1024 мы не докачиваем файл?

Читаешь 1024 байта, а потом ждёшь, что epoll тебя ещё событие пришлёт, при этом запросив edge-triggered. Если на момент чтения в буфере сокета накопилось данных больше, чем 1024 байта, после одного read() данные там останутся. И epoll может тебе больше никогда не сгенерировать событие. Если ты читаешь больше байт за раз, ниже вероятность того, что данные останутся после этого одного read().

Итого: читать нужно, пока read() не вернёт тебе -1, с errno=EAGAIN или 0.