文档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 执行 virtuoso 命令后,界面没有,cadence 启动不起来
    • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
    • ¥20 有关区间dp的问题求解
    • ¥15 多电路系统共用电源的串扰问题
    • ¥15 slam rangenet++配置
    • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
    • ¥15 ubuntu子系统密码忘记
    • ¥15 保护模式-系统加载-段寄存器
    • ¥15 电脑桌面设定一个区域禁止鼠标操作
    • ¥15 求NPF226060磁芯的详细资料