嵌入式 Linux下curl库API简单介绍

1:CURLcode curl_global_init(long flags);

    这个函数全局需要调用一次(多次调用也可以,不过没有必要), 所以这也是把Curlplus设计成单体类的原因,curl_global_init函数在其他libcurl函数调用前至少调用一次,程序最后需要调用curl_global_cleanup,进行清理。

参数:flags 

CURL_GLOBAL_ALL Initialize everything possible. This sets all known bits.

CURL_GLOBAL_SSL Initialize SSL

CURL_GLOBAL_WIN32 Initialize the Win32 socket libraries.

CURL_GLOBAL_NOTHING Initialise nothing extra. This sets no bit.

 

CURLcode 是一个enum,当CURLcode为CURLE_OK时,表示函数执行成功,否则失败,具体错误原因可以查看<curl/curl.h>文件内的定义。

 

2:curl_easy_init() - Start a libcurl easy session

curl_easy_init用来初始化一个CURL的指针(有些像返回FILE类型的指针一样). 相应的在调用结束时要用curl_easy_cleanup函数清理. 一般curl_easy_init意味着一个会话的开始. 它的返回值是CURL *,curl_easy_init函数是线程相关的,也就是说不能在一个线程中调用另外一个线程通过curl_easy_init创建的CURL指针。

 

3:CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter); 

描述: 这个函数最重要了.几乎所有的curl 程序都要频繁的使用它.它告诉curl库.程序将有如何的行为. 比如要查看一个网页的html代码等.,要想具体了解CURL的行为,必须对CURLoption有足够的了解,具体可以参考:

http://curl.haxx.se/libcurl/c/curl_easy_setopt.html

 

这里有两个类型不易理解CURLOPT_WRITEFUNCTION,CURLOPT_WRITEDATA

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, Curlplus::writer);

 

设置一个回调函数,这个回调函数的格式是

size_t function( void *ptr, size_t size, size_t nmemb, void *stream);

ptr,返回数据的指针

size,返回数据每块的大小

nmemb,返回数据的块数(这里返回数据串的真正大小为size*nmemb)

stream,是curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer); 中的buffer的指针。

在上面的例子中,buffer设置为一个string对象,所以,在回调函数writer中有了writerData->append(data, len); 

 

4:CURLcode curl_easy_perform(CURL *handle);

执行远程请求

 

参考资料

http://curl.haxx.se/

http://curl.haxx.se/lxr/source/docs/examples/

 

基于curl 的C API写了一个扩展C++ singleton类(当然curl也有C++ API),这个单体类只是对HTTP请求做了简单封装,提供post,get方法,并得到请求url内的返回值(保存到string对象中),也很容易扩展到其他协议上去。

Curlplus.h文件

#ifndef _CURLPLUS_H__

#define _CURLPLUS_H__ 

 

#ifndef __CURL_CURL_H

#include <curl/curl.h>

#endif

 

#ifndef __CURL_EASY_H

#include <curl/easy.h>

#endif

 

#include <memory>

#include <string> 

 

using namespace::std; 

 

namespace CP

{

    class Curlplus

    {

    public:

        static  Curlplus& get_instance();

        string post(const string& url,const string& content) const;

        string get(const string& url) const;

    protected:

        Curlplus(void);

        ~Curlplus(void);

        Curlplus(const Curlplus&);

        Curlplus& operator=(const Curlplus&);

        static int writer(char *data, size_t size, size_t nmemb,std::string *writerData);

    private:

        static auto_ptr<Curlplus> _instance;

        inline void _setCurlopt(CURL *curl,const string& url) const;

        // default timeout 300s

        static const int _defaulttimeout = 300;

        static string buffer;

        friend class auto_ptr<Curlplus>;

    };

}

 

#endif 

 

Curlpuls.cc文件 

 

#ifndef SPIVOT_CURLPLUS_H__

#include "Curlplus.h"

#endif 

 

using namespace std;

using namespace CP;

 

 

auto_ptr<Curlplus> Curlplus::_instance;

string Curlplus::buffer;

static char errorBuffer[CURL_ERROR_SIZE]; 

 

Curlplus& Curlplus::get_instance()

{

    if(_instance.get() == NULL)

    {

        _instance.reset(new Curlplus());

    } 

 

    return *_instance.get();

}

 

int Curlplus::writer(char *data, size_t size, size_t nmemb, string *writerData)

{

    if (writerData == NULL)

        return 0;

    int len = size*nmemb;

    writerData->append(data, len);

 

    return len;

}

 

Curlplus::Curlplus(void)

 

    CURLcode code = curl_global_init(CURL_GLOBAL_ALL);

    if(code != CURLE_OK)

    {

        cout << "curl_init failed, error code is: " << code;

    }

}

 

Curlplus::~Curlplus(void)

{

    curl_global_cleanup();

 

string Curlplus::post(const string& url, const string& content) const

{

    buffer="";

    CURL *curl = curl_easy_init();

    if(curl == NULL)

    {

        cout << "curl_easy_init failed ";

    }  

 

    _setCurlopt(curl,url);

    curl_easy_setopt(curl, CURLOPT_POST, 1 );

    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, content.c_str());   

 

    CURLcode code = curl_easy_perform(curl);

    if(code != CURLE_OK)

    {

        cout << "curl_easy_perform failed: "<< code;

    }

    curl_easy_cleanup(curl);

 

    return buffer;

 

string Curlplus::get(const string& url) const

{

    buffer="";

    CURL *curl = curl_easy_init();

    if(curl == NULL)

    {

        cout << "curl_easy_init failed ";

    }  

 

    _setCurlopt(curl,url);

    CURLcode code = curl_easy_perform(curl); 

 

    if(code != CURLE_OK)

    {

        cout << "curl_easy_perform failed: "<< code;

    }

    curl_easy_cleanup(curl);

    return buffer;

}

 

void Curlplus::_setCurlopt(CURL *curl,const string& url) const {

    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);

    curl_easy_setopt(curl, CURLOPT_HEADER, 0);

    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

    curl_easy_setopt(curl, CURLOPT_TIMEOUT, _defaulttimeout);

    //curl_easy_setopt(curl, CURLOPT_VERBOSE, true);

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, Curlplus::writer);

    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);

 

}

时间: 2024-10-30 04:30:21

嵌入式 Linux下curl库API简单介绍的相关文章

《嵌入式 Linux C 语言应用程序设计(修订版)》——第 2 章 嵌入式Linux C语言开发工具 2.1 嵌入式Linux下C语言概述

第 2 章 嵌入式Linux C语言开发工具 本章目标 任何应用程序的开发都离不开编辑器.编译器及调试器,嵌入式Linux的C语言开发也一样,它也有一套优秀的编辑.编译及调试工具. 掌握这些工具的使用是至关重要的,它直接影响到程序开发的效率.因此,希望读者能自己动手操作,切实熟练掌握这些工具的使用.通过本章的学习,读者将会掌握如下内容: 2.1 嵌入式Linux下C语言概述 读者在第一章中已经了解了嵌入式开发的基本流程,在嵌入式系统中应用程序的主体是在宿主机中开发完成的,就嵌入式Linux而言,

《嵌入式 Linux C 语言应用程序设计(修订版)》——2.1 嵌入式Linux下C语言概述

2.1 嵌入式Linux下C语言概述 嵌入式 Linux C 语言应用程序设计(修订版) 读者在第一章中已经了解了嵌入式开发的基本流程,在嵌入式系统中应用程序的主体是在宿主机中开发完成的,就嵌入式Linux而言,此过程则一般是在安装有Linux的宿主机中完成. 在本章中介绍的实际是嵌入式Linux下C语言的开发工具,用户在开发时往往是在Linux宿主机中对程序进行调试,然后再进行交叉编译的. 2.1.1 C语言简史 C语言于20世纪70年代诞生于美国的贝尔实验室.在此之前,人们编写系统软件主要是

《嵌入式 Linux C 语言应用程序设计(修订版)》一第2章 嵌入式Linux C语言开发工具2.1 嵌入式Linux下C语言概述

第 2 章 嵌入式Linux C语言开发工具 嵌入式 Linux C 语言应用程序设计(修订版)本章目标 任何应用程序的开发都离不开编辑器.编译器及调试器,嵌入式Linux的C语言开发也一样,它也有一套优秀的编辑.编译及调试工具. 掌握这些工具的使用是至关重要的,它直接影响到程序开发的效率.因此,希望读者能自己动手操作,切实熟练掌握这些工具的使用.通过本章的学习,读者将会掌握如下内容: anniuC语言的产生历史背景 anniu嵌入式Linux下C语言的开发环境 anniu嵌入式Linux下的编

【OS】Linux下 /dev 常见特殊设备介绍与应用[loop]

[OS]Linux下 /dev 常见特殊设备介绍与应用[loop] 在这里详细介绍一下loop设备.在进行某些测试的时候,往往需要新建一些磁盘分区或者设备等,此时对硬盘进行重新划分往往不太方便.在这种情况下,可以通过loop伪设备来实现循环挂载,从而达到目的.在使用之前,循环设备必须与现存文件系统上的文件相关联.这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用.因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载.这种设备文件经

嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误

    嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报  分类:   嵌入式(928)  一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的. 在glibc头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈.   [cpp] vie

转: 嵌入式linux下usb驱动开发方法--看完少走弯路【转】

转自:http://blog.csdn.net/jimmy_1986/article/details/5838297 嵌入式linux下的usb属于所有驱动中相当复杂的一个子系统,要想将她彻底征服,至少需要个把月的时间,不信?那是你没做过. 本人做过2年的嵌入式驱动开发,usb占了一大半的时间.期间走了不少弯路,下面将我的血的经验教训总结下,为要从事和正在从事的战友们做一点点贡献吧:) 首先,扫盲: 要做的是阅读usb Spec(英文的哦,其实很多文章.书籍和资料真有水平的还是原创的好,就像食品

嵌入式-Linux下,如何将H.264的帧文件,保存为视频文件,可供播放?

问题描述 Linux下,如何将H.264的帧文件,保存为视频文件,可供播放? 我目前是在嵌入式Linux下,将H.264编码后的视频帧,通过网络传输至另外一端.请部,作为接收端,应该通过哪种方式或工具,将视频帧保存为视频文件,可供电脑播放? 发送端大约每秒发送25帧,通过无线传输,有可能中间有丢失帧.而保存的文件,需要将丢失帧也考虑进保存的文件中,谢谢了!! 解决方案 http://bbs.csdn.net/topics/390041128 解决方案二: 看看这个帖子可有用http://bbs.

[c/c++]关于linux下动态库/静态库的基础问题

问题描述 [c/c++]关于linux下动态库/静态库的基础问题 本人小白,自学没多久,有几个问题一直没搞太明白,望高手解答! 假如我写了一个动态库libmylib.so(我有函数声明mylib.h),里面用到了A同学写的动态库liba.so(我有声明a.h),现在我要在一个新的程序test.cpp里调用我写的mylib.so 问题: 1.test.cpp的头文件需要两个.h都包含还是只要mylib.h? 2.用g++链接时 -lmylib -la都需要吗? 3.假如有一天liba.so文件丢失

linux基础-Linux下blas库安装问题,麻烦啦

问题描述 Linux下blas库安装问题,麻烦啦 Linux小白,刚上手,安装一个程序,需要blas库,但是一直装不上.想咨询一下大家,帮忙搞定的,给发微信红包.麻烦啦- 解决方案 可以加个微信聊,小白问题多 解决方案二: 如果你有安装包的话,就直接解压,然后进入解压后的文件夹 然后 ./configure make make install就ok了 解决方案三: ./configure make make install 解决方案四: 你是用的啥系统.用的源码还是啥? ubuntu 我用 ap