时间:2014-10-17 09:49:57 来源: 复制分享
问题描述:
今天想做一个简单的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 }