C libevent2中的分块响应
我正在尝试以以下方式对libevent中的大文件执行分块响应:C libevent2中的分块响应,c,libevent,transfer-encoding,chunked-encoding,C,Libevent,Transfer Encoding,Chunked Encoding,我正在尝试以以下方式对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;) { datab
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_文件是异步的,所以第三个或更多的evhttp_send_reply_块给了我一个错误或类似的信息:
[警告]evhttp\u发送\u链关闭45:错误的文件描述符
我将MAX_READ_SIZE设置为8,以实际测试分块传输编码
我注意到有一个evhttp_request_set_chunked_cb struct evhttp_request*,void*cbstruct evhttp_request*,void*方法我可以使用,但找不到任何关于如何使用的示例
例如,如何将参数传递给回调?这个参数似乎是传递给请求处理程序的同一个参数,这不是我想要的,因为我想要创建一个包含文件描述符和我要发送的文件偏移量的对象
谢谢你的帮助
提前谢谢
Sri并没有说它是异步的,但它确实说它关闭了您的代码没有考虑的文件描述符
我相信您需要移动int fd=openfilename,O_RDONLY;在你的循环中
您还可以在文件代码之外测试块处理,只需从头构建一个字符串缓冲区
除此之外,最后一行应该是fclosefp;你的例子看起来很正确好朋友。谢谢你。我刚刚意识到,我想要分块传输的唯一原因是为了避免缓冲区读取。但由于evbuffer\u add\u文件已经在发现sendfile时使用了它,所以这并不是一个真正的问题
因此,我完全移除了循环并尝试。但内容仍然没有发送。但至少这次我没有坏的文件描述符错误,你是对的-这是由于文件被关闭-检查文件句柄确认了这一点 Sri,请使用此注释更新您的问题,并接受回答或对问题添加评论,尽量不要在其他答案中添加澄清