【发布时间】:2010-03-18 07:15:02
【问题描述】:
我正在尝试以这种方式在 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 给了我一个错误(或类似的东西):
[warn] evhttp_send_chain Closed(45): 错误的文件描述符
我将MAX_READ_SIZE 设置为8 以实际测试分块传输编码。
我注意到有一个 evhttp_request_set_chunked_cb (struct evhttp_request *, void(*cb)(struct evhttp_request *, void *)) 方法我可以使用,但找不到任何有关如何使用的示例。
例如,我如何将参数传递给回调?该参数似乎与传递给请求处理程序的参数相同,这不是我想要的,因为我想创建一个包含文件描述符和我发送出去的文件偏移量的对象。
感谢所有帮助。
提前致谢 斯里
【问题讨论】:
标签: c libevent transfer-encoding chunked-encoding