前言

想用闲置的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 (根据自己机器设置)交叉编译器工具

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐