2010-03-18 2 views
0

Я пытаюсь сделать блочный ответ (большие файлы) в Libevent этого путем ::Chunked ответов в libevent2

evhttp_send_reply_start(request, HTTP_OK, "OK"); 

int fd = open("filename", O_RDONLY); 
size_t fileSize = <get_file_size>; 
struct evbuffer *databuff = NULL; 
for (off_t offset = 0;offset < fileSize;) 
{ 
    databuff = evbuffer_new(); 

    size_t bytesLeft = fileSize - offset; 
    size_t bytesToRead = bytesLeft > MAX_READ_SIZE ? MAX_READ_SIZE : bytesLeft; 

    evbuffer_add_file(databuff, fd, offset, bytesToRead); 
    offset += bytesToRead; 

    evhttp_send_reply_chunk(request, databuff); // send it 
    evbuffer_free(databuff);     // destroy it 
} 

evhttp_send_reply_end(request); 

fclose(fptr); 

Проблема с этим у меня есть чувство add_file асинхронное так третий или так evhttp_send_reply_chunk дает мне ошибку (или что-то подобное):

[предупредит] evhttp_send_chain Closed (45): дескриптор файла Bad

Я установил MAX_READ_SIZE, чтобы быть 8, чтобы фактически протестировать кодировку с коротким передачей.

Я заметил, что существует метод evhttp_request_set_chunked_cb (struct evhttp_request *, void(*cb)(struct evhttp_request *, void *)), который я мог бы использовать, но не смог найти примеров использования.

Например, как я могу передать аргумент для обратного вызова? Аргумент, похоже, тот же аргумент, который был передан обработчику запроса, который не является тем, что я хочу, потому что я хочу создать объект, содержащий дескриптор файла и смещение файла, которое я отправляю.

Цените всю помощь.

Заранее спасибо Шри

ответ

0

The libevent v2 documentation не говорит, что это асинхронная, но это не сказать, что она закрывает дескриптор файла, который ваш код не учитывает.

Я считаю, что вам нужно переместить int fd = open("filename", O_RDONLY); внутри вашей петли.

вы также можете протестировать обработку фрагментов вне вашего файла, просто создав строковый буфер с нуля.

помимо этого, (и последняя строка, которая должна быть fclose(fp); вашего примером выглядит правильно

0

Ницца мат. Спасибо за это. Я просто понял, что единственная причина, почему я хотел фрагментированные переводы были избежать буферов чтения Но поскольку evbuffer_add_file уже использует sendfile (если он находит это), это не проблема.

Так что я полностью удалил петлю и попытался. Но содержимое по-прежнему не отправляется, но по крайней мере на этот раз у меня нет неверная ошибка дескриптора файла (вы правы - это было связано с закрытием файла - проверка файлов подтвердила это!).

+1

Sri, пожалуйста, обновите свой вопрос с помощью этой заметки и примите ответ (или добавьте комментарии к вопросу), постарайтесь не добавлять разъяснения в другие ответы – Jehiah