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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
向linux服务器上传下载文件方式收集
向linux服务器上传下载文件方式收集 1. scp 【优点】简单方便,安全可靠;支持限速参数 【缺点】不支持排除目录 【用法】 scp就是secure copy,是用来进行远程文件拷贝的。数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证 。  命令格式: scp [参数] : : 举例: scp /home/work/sourc
使用xshell从linux服务器下载文件到windows
使用xshell来操作服务非常方便,传文件也比较方便。 就是使用rz,sz 首先,服务器要安装了rz,sz yum install lrzsz 当然你的本地windows主机也通过ssh连接了linux服务器 运行rz,会将windows的文件传到linux服务器 运行sz filename,会将文件下载到windows本地
libcurl使用HTTP的get请求来下载文件
首先设置好下载链接 int ret = curl_easy_setopt(easy_handle, CURLOPT_URL, "http://speedtest.wdc01.softlayer.com/downloads/test10.zip"); 然后设置CURLOPT_WRITEFUNCTION属性保存接受的数据 ret |= curl_easy_setopt(easy_handle,
LINUX命令行下以HTTP方式下载文件的方法
顺便提一下。如果下载ftp服务器上的文件,可以用ftp命令。然后用get命令下载文件   对于喜欢命令行操作及追求高效率、高速度下载的朋友,推荐使用命令行下载工具。命令行工具不但使用方便,而且大多具有很高的下载速度及下载效率,尤其适合于大批量下载文件。下面就为大家详细介绍一下这些工具。   Wget   Wget是一个十分常用命令行下载工具,多数Linux发行版本都默认包含这个工
linux XShell上传、下载本地文件到linux服务器
1.连接设置(linux客户端) 注:1.正确填写用户身份认证信息(用户名和密码);      2.在ZMODEM 添加上图设置 2.linux服务器端设置 在linux主机上,安装上传下载工具包rz及sz; 如果不知道你要安装包的具体名称,可以使用yum provides */name 进行查找系统自带软件包的信息; [html] view pl
linux安装svn使用解压包的方式
1. 采用源文件编译安装。源文件共两个,为: subversion-1.6.1.tar.gz (subversion 源文件) subversion-deps-1.6.1.tar.gz (subversion依赖文件) 注意文件版本必须一致,否则很容易产生各种奇怪的问题. 2. 上传以上两个文件到服务器上,解压。解压命令为:   1 tar x
http的get方式连接服务器,获取数据
首先,定义一个回调接口,创造两个抽象方法,用于在发送http请求之后回调结果和抛出异常: public interface HttpCallbackListener { void onFinish(String response); //http访问结束之后回调 void onError(Exception e); //出现异常的时候回调 } 然后
本地文件上传到Linux服务器的几种方法
本文介绍几种常见的方法,把文件上传到Linux服务器中!常见有使用:scp命令、xshell软件里的xftp程序、U盘挂载、服务器自带的lrzsz程序。一、scp使用说明:1、把本机的文件传给目的服务器:1scp get66.pcap root@192.168.1.147:/super备注:把本机get66.pcap拷贝到147这台服务器的super目录下,需要提供147的密码2、在本机上执行sc...
java使用HttpGet下载文件
java下载文件
在Linux服务器下载上传文件到windows
1.rz/sz yum install : 首先安装rs/sz,直接在linux终端上输入以下代码则自动安装。 $> yum install lrzsz  Loaded plugins: fastestmirror  Loading mirror speeds from cached hostfile   * addons: data.nicehosting.co.kr   *