2 zhangwei159 zhangwei159 于 2013.07.24 09:38 提问

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);
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!