Преамбула: облегченный сервер HTTP написана на C основана на Libevent v2 (evhttp), Linux, ARM, glibc2.3.4Обслуживание больших файлов (> 2 Гб) с Libevent на 32-битной системе
Я пытаюсь служить большие файлы (более 2 ГБ) с использованием evbuffer_add_file() в 32-битной системе. Libevent был скомпилирован с флагом -D_FILE_OFFSET_BITS = 64. Вот упрощенный код:
int fd = -1;
if ((fd = open(path, O_RDONLY)) < 0) {
// error handling
}
struct stat st;
if (fstat(fd, &st) < 0) {
// error handling
}
struct evbuffer *buffer = evbuffer_new();
evbuffer_set_flags(buffer, EVBUFFER_FLAG_DRAINS_TO_FD); // force using system's sendfile
evbuffer_add_file(buffer, fd, 0, st.st_size);
evhttp_send_reply(req, 200, NULL, buffer);
evbuffer_free(buffer);
st.st_size имеет правильное значение, в данном случае 4913809524, но заголовок ответа Content-Length имеет значение 618842228. Даже если я установить заголовок Content-Length, чтобы соответствующее значение передачи файлов останавливается на 618842228 ...
Пропустить или сделать что-то не так? Это вообще возможно?
Заранее спасибо
Так что, когда '(((ev_off_t) st.st_size) = st.st_size) 'у вас проблемы? – chux
нет, в моем случае (((ev_off_t) st.st_size) == st.st_size). Я думаю, что проблема заключается в реализации sendfile системы, а не в libevent ... Решена эта проблема, реализовав потоковое использование, используя evhttp_send_reply_start()/evhttp_send_reply_chunk()/evhttp_send_reply_end() – dvinogradov