libghttp库的安装和简单使用
libghttp库使用心得前言libghttp库下载安装libghttp库的使用编写一个简单的libghttp测试程序稍微改造下编译前言想用闲置的linux开发板写个采集程序,涉及到http相关的东西,这东西一般都有现成的库,找了找,发现有个轻量级libghttp库,并且源码也开源,出了问题还可以调试源码,下载下来看了下,正符合我的需求,因此,先在虚拟机上编译测试下该库,然后再编译移植到开发板去。
libghttp库使用心得
前言
想用闲置的linux开发板写个采集程序,涉及到http相关的东西,这东西一般都有现成的库,找了找,发现有个轻量级libghttp库,并且源码也开源,出了问题还可以调试源码,下载下来看了下,正符合我的需求,因此,先在虚拟机上编译测试下该库,然后再编译移植到开发板去。
libghttp库下载安装
一般开源库或代码都可以在github找到,因此我们可以从github上来取libghttp源码:
git clone https://github.com/sknown/libghttp.git
ps:如果拉取失败,可以直接在浏览器上下载
网址:https://github.com/sknown/libghttp
下载完成后,可以在当前目录看到一个libghttp/目录
进入libghttp文件夹,可以看到configure文件
./configure --prefix=$(pwd)/build 执行后出现错误
*-x86-unkown
在csdn中,查到需要将config.guess和config.sub这两个文件替换掉,因此我们可以通过find / -name config.guess查找当前系统有这两个文件的路径(需要安装libtool),我的系统上需要使用以下两个文件才可以,在libghttp目录下
cp /usr/share/libtool/build-aux/config.guess ./
cp /usr/share/libtool/build-aux/config.sub ./
接着重新configure一下,这个时候应该就没错误了,还有错误的话,百度大法查一下
./configure --prefix=$(pwd)/build
make
make install
libghttp库的使用
通过上一个步骤,咱们将编译后的库文件放在了libghttp/build里面(通过configure --prefix配置)
include
以上两个文件就是libghttp库对外开发的头文件了
lib
上面就是libghttp库文件,一般我们只需要动态库即可,静态库不使用可以删除
编写一个简单的libghttp测试程序
libghttp测试程序网上一搜一大把,这里我主要讲下我在网上看到的一些代码,结合个人理解,感觉有点问题,可能理解的不对,大家如果有正确的答案,可以告诉我下。
网上的部分代码,我觉得有疑问的部分已经标注出来:
int netGet(char* url, char* params, int timeout, char **result, int result_len) {
ghttp_request *request = NULL;
request = ghttp_request_new();
if(params!=NULL&&strlen(params)>0)
{
char tmp[1024];
strcpy(tmp,url);
if(strchr(tmp, '?') == NULL)//url不存在
{ strcat(tmp,"?") ;
}
strcat(tmp,params) ;
printf("%s\n",tmp);
ghttp_set_uri(request, tmp);
ghttp_set_proxy(request, tmp);
}else{
ghttp_set_uri(request, url);
ghttp_set_proxy(request, url);
}
ghttp_set_type(request, ghttp_type_get); //get方法
ghttp_set_header(request, http_hdr_Connection, "close");
char timeout_str[10];
sprintf(timeout_str, "%d", timeout);
ghttp_set_header(request, http_hdr_Timeout, timeout_str);
ghttp_prepare(request);
ghttp_process(request);
*result = ghttp_get_body(request);//**这里获取到body的地址,但是request在下面被释放了,这里还将地址返回去,很危险**
result_len = ghttp_get_body_len(request);//**这个长度在这里毫无意义,既没有使用,也不能返回给上层**
ghttp_request_destroy(request);//**这里将request释放掉,对应的body数据也被释放掉了**
return 0;
}
稍微改造下
int netGet(char* url, char* params, int timeout,
void (*http_get_callBack)(char *src , void *user_data),void *user_data)
{
ghttp_request *request = NULL;
request = ghttp_request_new();
if(params!=NULL&&strlen(params)>0)
{
char tmp[1024];
strcpy(tmp,url);
if(strchr(tmp, '?') == NULL)//url不存在
{ strcat(tmp,"?") ;
}
strcat(tmp,params) ;
//printf("%s\n",tmp);
ghttp_set_uri(request, tmp);
ghttp_set_proxy(request, tmp);
}else{
ghttp_set_uri(request, url);
ghttp_set_proxy(request, url);
}
ghttp_set_type(request, ghttp_type_get); //get方法
ghttp_set_header(request, http_hdr_Connection, "close");
char timeout_str[10];
sprintf(timeout_str, "%d", timeout);
ghttp_set_header(request, http_hdr_Timeout, timeout_str);
ghttp_prepare(request);
ghttp_status ret = ghttp_process(request);
if(ghttp_done != ret)
{
printf("process err:%d\r\n",ret);
}
char *result = ghttp_get_body(request);
//int result_len = ghttp_get_body_len(request);
if((result != NULL) && (http_get_callBack_proc != NULL))
{
http_get_callBack(result , user_data);
}
ghttp_request_destroy(request);
return 0;
}
首先这个是使用同步的思想,异步请自行查找库的使用方法,这里将get服务器后收到的数据,先处理后,再释放对应的内存,此时用户可以通过设置回调进行数据的处理。
编译
对了,最重要的,编译链接需要加上 -lghttp
最后,需要移植到ARM开发板的话,只需要在编译libghttp库时,设置相应的arm-linux-gnueabihf-gcc (根据自己机器设置)交叉编译器工具
更多推荐
所有评论(0)