我正在尝试以这种方式在 libevent 中进行分块响应(大文件)::
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): 错误的文件描述符
我MAX_READ_SIZE
打算8
实际测试分块传输编码。
我注意到有一种evhttp_request_set_chunked_cb (struct evhttp_request *, void(*cb)(struct evhttp_request *, void *))
方法我可以使用,但找不到任何关于如何使用的示例。
例如,我如何将参数传递给回调?该参数似乎与传递给请求处理程序的参数相同,这不是我想要的,因为我想创建一个包含文件描述符和我发送的文件偏移量的对象。
感谢所有帮助。
在此先感谢