История изменений
Исправление 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.