文档1111 2013-07-24 01:38
浏览 1404

HTTP使用GET方式从linux服务器上下载压缩包

以下代码是实现每次使用HTTP的GET方式获取文件的路径地址,然后使用read方式读取linux服务器该路径下的压缩包飞,发送给用户。

在我自己布置的环境中,使用该代码,可以随意下载都没问题,但是在客户那边布置的linux环境中,就出问题了。第一次下载OK,也成功的。但是接下来下就不成功了。这时候在屏幕是出现了[err] event_queue_insert: 0x9288f68(fd 7) already on queue 1错误。
进程没有挂掉。请各位牛人帮忙看看是哪出问题了?
谢谢!!

代码如下所示:
// 分析请求
uri = strdup((char*)evhttp_request_uri(req));
if(memcmp(uri, GetWayURL, strlen(GetWayURL) != 0))
{
free(uri);
buf = evbuffer_new();
evbuffer_add_printf(buf, "%s", "HTTP_BADREQUEST");
// 输出
evhttp_send_reply(req, HTTP_BADREQUEST, "OK", buf);
evbuffer_free(buf);
return -1;
}
evhttp_parse_query(uri, &httpsqs_http_query);
free(uri);
/* 接收GET表单参数 */
const char *types = evhttp_find_header (&httpsqs_http_query, "filename");
// printf("filename --[%s]\n",types);

// 返回HTTP头部

evhttp_add_header(req->output_headers, "Content-Type", "text/plain; charset=UTF-8");
evhttp_add_header(req->output_headers, "Server", "XXL@Sunyard");
evhttp_add_header(req->output_headers, "Connection", "close");
strncpy(file_name, types, strlen(types));
fp = fopen(file_name,"r");
if(NULL == fp )
{
printf("File:\t%s Not Found\n", file_name);
}
else
{
bzero(buffer, 1024);
while( (file_block_length = fread(buffer,sizeof(char),1024,fp))>0)
{
// 将要输出的值写入输出缓存
evbuffer_add(buf, buffer, file_block_length);
i+=file_block_length;
memset(buffer,0,sizeof(buffer));
} //这段代码是循环读取文件的一段数据,在循环调用send,发送到客户端,这里强调一点的TCP每次接受最多是1024字节,多了就会分片,因此每次发送时尽量不要超过1024字节。
fclose(fp);
}

    // 输出
evhttp_send_reply(req, HTTP_OK, "OK", buf);
 // 内存释放
evbuffer_free(buf);
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
    • ¥50 汇编语言除法溢出问题
    • ¥65 C++实现删除N个数据列表共有的元素
    • ¥15 Visual Studio问题
    • ¥15 state显示变量是字符串形式,但是仍然红色,无法引用,并显示类型不匹配
    • ¥20 求一个html代码,有偿
    • ¥100 关于使用MATLAB中copularnd函数的问题
    • ¥20 在虚拟机的pycharm上
    • ¥15 jupyterthemes 设置完毕后没有效果
    • ¥15 matlab图像高斯低通滤波