- 浏览: 2031328 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
curl c api
关于Curl的介绍很多,这里不详细介绍,主要谈一下简单应用。
最近研究了一下Linux下的curl C API,curl c API的文档比较丰富,唯一就是查找起来,费些时间。Curl的C API和curl的PHP API,函数接口和作用大致相同,所以如果有PHP 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);
}
发表评论
-
多机器执行ssh脚本
2012-08-30 18:12 2235#!/bin/bash Usage() { ... -
Berkeley DB 使用经验总结
2012-08-27 14:41 3083作者:陈磊 NoSQL是现在互联网Web2.0时代备受 ... -
嵌入式数据库系统Berkeley DB
2012-08-27 14:37 1527前言 UNIX/LINUX平台下的数据库种类非常多 ... -
shell中双引号的误用
2011-05-12 15:02 1178for i in "$LIST" ... -
shell for循环
2011-04-06 15:36 974for i in "1 2 3";do e ... -
shell技巧 除法
2011-03-07 11:34 19174shell计算中使用除法,基本默认上都是整除。 比如: ... -
.bash_profile 文件修改之后不执行
2011-02-16 11:21 1934重新登录 不可能不好用的 除非你是从一个用户su oralc ... -
SecureCRT中文显示乱码的解决方法
2011-02-12 11:38 1340最近开始用SecureCRT登陆linux系统,由于是新手,很 ... -
让putty显示中文
2011-02-11 14:43 1420对于经常在windows下远程ssh到linux的用户而言,p ... -
Linux文件类型全解析
2011-01-04 15:13 1406Linux文件类型全解析 ... -
Linux进程状态解析之T、Z、X
2011-01-04 15:09 1824摘要: Linux系统中进程有很多种 ... -
Linux进程状态解析之R、S、D
2011-01-04 14:54 4885摘要: Linu ... -
shell获取参数
2010-12-31 15:29 4190#!/bin/bash Usage() { ... -
Shell实现cgi接口示例
2010-12-30 14:59 1997ls -l /var/www/cgi-bin/ -rwxrw ... -
shell数组
2010-12-29 16:48 1298shell数组 Bash中还可以使用数 ... -
shell 自动化处理
2010-12-29 15:52 1037#!/bin/bash sudo yum instal ... -
Linux用户添加sudoer
2010-12-29 11:37 25104使用sudo可以在以非root用户登录时临时获得root权限, ... -
lsof:一个功能强大的命令
2010-12-24 16:30 1349lsof:一个功能强大的命令 lsof命令的原始功能 ... -
linux 的库操作命令 ar和nm
2010-12-22 20:31 1402当我们的程序中有经 ... -
LINUX查看硬件配置 命令
2010-12-21 18:55 1069常用命令整理如下: 查看主板的序列号: dmidec ...
相关推荐
`curl`库不仅可以在命令行中使用,还可以被集成到C/C++、Java、Python等多语言的程序中,方便进行网络数据传输。在C++环境中,`curl`库通常通过API调用来实现网络请求。 ### 安装与配置 在Windows环境下,`curl`库...
例如,开发者常使用`curl`与API交互,获取或发送JSON数据。通过管道(`|`)或重定向(`>`), `curl`可以与其他命令结合,实现复杂的自动化任务。 在压缩包`curl文件`中,可能包含了不同版本的`curl`,包括源代码、预...
1. **src目录**:这是CURL的核心源代码,包含了许多.c文件,如`curl.c`(主程序入口)、`transfer.c`(负责数据传输)、`multi.c`(处理多线程或多路复用请求)等。通过阅读这些源码,你可以了解CURL如何处理网络...
首先,我们需要创建一个C语言的回调函数,该函数将接收四个参数:`dltotal`(总下载大小),`dlnow`(已下载大小),`ultotal`(总上传大小),`ulnow`(已上传大小)。例如: ```c int progress_callback(void *...
Curl库的核心是使用ANSI C编写,这使得Curl具有高度的可移植性,能够在各种操作系统和硬件平台上运行,包括但不限于Windows、Linux、Mac OS X以及各种嵌入式系统。ANSI C是一种标准的C语言版本,它的语法和库函数被...
Lua-cURL是一个用于在Lua环境中实现HTTP和HTTPS访问的库,它是基于著名的C语言库cURL构建的。这个库提供了全面的功能,使得Lua脚本能够方便地与Web服务进行交互,比如发送GET、POST请求,处理cookies,上传文件,...
标题 "NDK25 API28 curl" 指涉的是使用NDK(Native Development Kit)版本25,针对Android API级别28,与curl库的集成和构建过程。curl是一个广泛使用的开源库,用于在命令行或程序中执行HTTP和其他网络协议的传输...
5. **版本兼容性**:确保使用的`curl`库版本与你的编译环境和项目需求相匹配,不同版本的库可能包含不同的功能或API。 6. **头文件**:确保包含了`curl`库的头文件,如`#include <curl/curl.h>`,这提供了访问`curl...
3. `include`目录:包含了头文件,供开发者在C/C++项目中调用curl库。 4. `lib`目录:包含库文件(.lib或.dll),供链接使用。 5. `docs`:文档和手册页,介绍curl的使用方法和API参考。 6. `examples`:示例代码,...
将`C:/path/to/curl/libs`替换为你的curl库实际路径。 5. **编写代码**:现在,你可以开始编写使用curl进行网络请求的代码了。以下是一个简单的示例: ```cpp #include #include <curl/curl.h> int main(int...
【百度翻译API接口C版】是为开发者提供的一种在C语言环境下实现文本翻译功能的工具。这个接口使得程序员能够轻松地将翻译功能集成到他们的C程序中,为跨语言通信和本地化工作提供了便利。下面将详细介绍这个API接口...
curl_easy_setopt(curl, CURLOPT_URL, "http://worldtimeapi.org/api/timezone/utc"); // 设置回调函数 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); // 执行请求 res = curl_easy_perform...
使用解压缩工具(如WinRAR或7-Zip)将其解压到任意文件夹,例如"C:\Tools\curl"。为了在命令行(如cmd或PowerShell)中无需指定完整路径就能使用Curl,需要将Curl的可执行文件路径添加到系统环境变量Path中。 1. ...
在实际开发中,`curl` 提供了丰富的API接口,如`curl_easy_init()`初始化一个简单的会话,`curl_easy_setopt()`设置请求选项,`curl_easy_perform()`执行请求,以及`curl_easy_cleanup()`释放资源。开发人员可以根据...
【标题】"githubapicpp" 是一个C++实现的库,它利用了CURL库和rapidjson库来与GitHub的REST API V3进行交互。这个项目的主要目标是为开发者提供一个简单、高效的接口,以便在C++项目中轻松地访问和操作GitHub的API。...
- Curl 是用 C 语言编写的,因此对性能有很高的优化。 - 它支持大量的网络协议,包括 HTTP/1.x、HTTP/2、HTTP/3、HTTPS、FTP、SFTP、TFTP、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP 等。 - Curl 支持多种认证...
cURL在开发中常用于API测试,例如,你可以用它测试RESTful API的响应。通过传递不同的参数,模拟客户端的行为,查看服务器返回的数据。此外,cURL也用于自动化任务,例如定期抓取网页内容,或者在脚本中执行HTTP操作...
LOCAL_SRC_FILES := $(wildcard src/*.c) # 用实际的Curl源文件替换 include $(BUILD_SHARED_LIBRARY) ``` 这里,`LOCAL_CFLAGS`包含了预处理宏,`LOCAL_LDLIBS`指定了链接所需的库,`LOCAL_SRC_FILES`列出了...