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);

}

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

  1. linux下静态库和动态库一些东西

    http://www.cnblogs.com/changefuture/archive/2011/12/22/2297460.html Linux  动态链接库和静态库示例 文件预览 文件目录树如下, ...

  2. 嵌入式 Linux下永久生效环境变量bashrc

    嵌入式 Linux下永久生效环境变量bashrc 1) .bashrc文件 在linux系统普通用户目录(cd /home/xxx)或root用户目录(cd /root)下,用指令ls -al可以看到 ...

  3. 谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH PKG_CONFIG_PATH

    谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH  PKG_CONFIG_PATH 转载自:http://blog.chinaunix.net/xmlrpc.ph ...

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

    嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报  分类: 嵌入式(928)  一般察看函数运行时堆栈的 ...

  5. app 下载更新 file-downloader 文件下载库的简单介绍和使用

    app 下载更新 file-downloader 文件下载库的简单介绍和使用 今天介绍一个下载库:file-downloader 文件下载库 说明: * 本文内容来自原 file-downloader ...

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

    转自:http://blog.csdn.net/jimmy_1986/article/details/5838297 嵌入式linux下的usb属于所有驱动中相当复杂的一个子系统,要想将她彻底征服,至 ...

  7. 转:linux下共享库的注意点之-fpic

    转: http://www.cnblogs.com/leo0000/p/5691483.html linux下共享库的注意点之-fpic 在编译共享库必须加上-fpic.这是为什么呢? 首先看一个简单 ...

  8. 深入理解LINUX下动态库链接器/加载器ld-linux.so.2

    [ld-linux-x86-64.so.2] 最近在Linux 环境下开发,搞了好几天 Compiler 和 linker,觉得有必要来写一篇关于Linux环境下 ld.so的文章了,google上搜 ...

  9. Linux下动态库生成和使用

    Linux下动态库生成和使用 一.动态库的基本概念 1.动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序.动态链接库是目标文件的集合,目标文件在动态链接库中 ...

随机推荐

  1. sql openxml sp_xml_preparedocument xml 中文乱码

    DECLARE @xmlText xml ,@idoc int set @xmlText = (select doc from openrowset(bulk 'C:\Word\SRC\WebApp\ ...

  2. 算法导论:Trie字典树

    1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...

  3. wordpress学习二:源码目录结构和启动流程

    wordpress安装后的文件目录如下: 其中的主要目录和文件用途介绍如下: wp-admin:用于进行博客后台设置的功能目录 wp-content: wordpress的 主题,插件和本地化的存储目 ...

  4. CreateFile,WriteFile,ReadFile

    注意: CreateFile 跟 fopen 不同,打开文件时不区分 文本方式 或 二进制 方式 ReadFile 或 WriteFile 都是对二进制数据进行操作 HANDLE WINAPI Cre ...

  5. JVM垃圾回收机制总结(2) :基本算法概述

    1.引用计数收集器 (Reference Counting) 引用计数是垃圾收集的早期策略.在这种方法中,堆中每一个对象都有一个引用计数.一个对象被创建了,并且指向该对象的引用被分配给一个变量,这个对 ...

  6. 怎样做出优秀的扁平化设计风格 PPT 或 Keynote 幻灯片演示文稿?(装)

    不知道你有没有想过,为什么很人多的扁平化 PPT 是这个样子: 或者是这样: 然而,还有一小撮人的扁平化 PPT 却拥有那么高颜值: 为什么会产生这么大的差距呢?丑逼 PPT 应该如何逆袭成为帅逼呢? ...

  7. MyBaits的各种基本查询方式

    <?xml version="1.0" encoding="gbk"?> <!DOCTYPE mapper PUBLIC "-//m ...

  8. leetcode:Insertion Sort List

    Sort a linked list using insertion sort. 分析:此题要求在链表上实现插入排序. 思路:插入排序是一种O(n^2)复杂度的算法,基本想法就是每次循环找到一个元素在 ...

  9. 安卓发展史以及安卓和苹果对比PPT

    此PPT由我们小组协力完成,介绍了Android的发展史以及android与苹果的一些比较.概述了android发展至今的一系列版本,功能的日益完善,它的强大性,灵活性,公开性使其拥有吸引客服的绝大魅 ...

  10. Android 用户界面---拖放(Drag and Drop)(一)

    用Android的拖放框架,能够允许用户使用图形化的拖放手势,把数据从当前布局中的一个View对象中移到另一个View对象中.这个框架包括:拖拽事件类.拖拽监听器.以及辅助的方法和类. 尽管这个框架主 ...