软件下载 | 资讯教程 | 最近更新 | 下载排行 | 一键转帖 | 发布投稿
您的位置:最火下载站 > 网络技术 > 技巧与工具 > libevent调用evbuffer_add_file卡死问题解决

libevent调用evbuffer_add_file卡死问题解决

问题描述:

今天想做一个简单的HTTP服务器,发现libevent使用很方便,就用他的example里的httpserver代码试了下,发现一个问题,就是在打开部分文件时候,服务器会卡住。没有任何返回,浏览器一直处于等待状态。
后来调试后发现,卡死在evbuffer_add_file函数。

源代码如下:

01 /* Otherwise it's a file; add it to the buffer to get

02 * sent via sendfile */

03 const char *type = guess_content_type(decoded_path);

04 if ((fd = open(whole_path, O_RDONLY)) < 0) {

05 perror("open");

06 goto err;

07 }

08 if (fstat(fd, &st)<0) {

09 /* Make sure the length still matches, now that we

10 * opened the file :/ */

11 perror("fstat");

12 goto err;

13 }

14 evhttp_add_header(evhttp_request_get_output_headers(req),

15 "Content-Type", type);

16 evbuffer_add_file(evb, fd, 0, st.st_size);

后经过调试发现,是由于代码第四行中打开文件的方式有问题。缺少O_BINARY标志,导致对于某些包含不可显示或者中文的文件会卡死。
改成如下代码即可:

1 /* Otherwise it's a file; add it to the buffer to get

2 * sent via sendfile */

3 const char *type = guess_content_type(decoded_path);

4 if ((fd = open(whole_path, O_RDONLY|O_BINARY)) < 0) {

5 perror("open");

6 goto err;

7 }
    相关阅读
    网友评论