Я пытаюсь сделать блочный ответ (большие файлы) в 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 *))
, который я мог бы использовать, но не смог найти примеров использования.
Например, как я могу передать аргумент для обратного вызова? Аргумент, похоже, тот же аргумент, который был передан обработчику запроса, который не является тем, что я хочу, потому что я хочу создать объект, содержащий дескриптор файла и смещение файла, которое я отправляю.
Цените всю помощь.
Заранее спасибо Шри
Sri, пожалуйста, обновите свой вопрос с помощью этой заметки и примите ответ (или добавьте комментарии к вопросу), постарайтесь не добавлять разъяснения в другие ответы – Jehiah