CURL开源库的学习及编程
1、CURL的下载及编译
CURL的安装及编译,详情查看此博主的博客
2019的安装及编译的指南博客
1.1Libcurl函数的介绍
首先调用curl_global_init()初始化libcurl
然后调用curl_easy_init()函数得到easy interface型的指针
调用curl_easyz_setop()t设置传输选项
调用curl_easyz_perform()函数完成传输任务
调用curl_easy_cleanup()释放内存
2、Libcurl的简单界面的函数
2.1初始化libcurl curl_global_init()
调用curl_global_init()这个函数只能用一次
(但是在调用完curl_global_cleanup函数后仍然可以使用)
如果此函数在curl_easy_init函数调用时还没调用,它由libcurl库自动调用,多线程调用此函数以防止在线程中curl_easy_init多次调用
curl_global_init()不能保证线程安全,所以不要在每个线程中都调用curl_global_init,应该将该函数的调用放在主线程中
2.2使用简单的函数获得句柄
curl_easy_init()获得句柄
2.3设置传输选项curl_easy_setopt()
curl所有的设置都是在该函数中完成的
由于setopt()函数有较多选项,在这里不进行一一介绍
详细选项情况查看
API curl C
curl_easy_setopt(CURL *handle, CURLOPT_URL , char *URL); 传入指向要使用的URL的指针
返回值,当返回成功的时候CURLE_OK,如果堆空间不足,则返回CURL_OUT_OF_MEMORY
curl_easy_setopt不会解析给定的字符串,如果给出一个错误的网址,在调用curl_easy_perform或类似内容之前不会检测到它
curl_easy_setopt(CURL *handle, CURLOPT_WRITEFUNCTION, write_callback); 用于写入接收数据的回调
size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata);函数原型
将指针传递给回调函数,该函数应与上面显示的原型匹配
函数将在libcurl接收到数据后被调用,因此函数多做数据保存的功能
curl_easy_setopt(CURL *handle, CURLOPT_WRITEDATA, void *pointer);传递给写入回调的指针
要传递给写入回调的数据指针
如果没用通过CURLOPT_WRITEFUNCTION属性给easy handle设置回调函数,libcurl会提供一个默认的回调函数,它只是简单的将接收到的数据打印到标准输出,当然也可以通过CURLOPT_WRITEDATA属性给默认回调函数传递一个已经打开的文件指针,用于将数据输出到文件里
curl_easy_setopt(CURL *handle, CURLOPT_HEADERFUNCTION, header_callback);接收标头数据的回调
size_t header_callback(char *buffer,size_t size, size_t nitems,void *userdata);函数原型
将指针传递给回调函数,该函数与上面显示的原型匹配
libcurl一旦接收到http头部数据后将调用该函数
每个标头将调用一次标头回调,并且将完整的标头行传递给回调
curl_easy_setopt(CURL *handle, CURLOPT_HEADERDATA, void *pointer);传递到标头回调的指针
传递一个指针,用于件接收数据的标头部分写入其中
curl_easy_setopt(CURL *handle, CURLOPT_READFUNCTION, read_callback);读取数据上传的回调
size_t read_callback(char *buffer, size_t size, size_t nitems, void *userdata);函数原型
将指针传递给回调函数,如上面的原型所示
这个回调函数在需要读取数据以便将其发送到对等方时立即被libcurl调用
curl_easy_setopt(CURL *handle, CURLOPT_READDATA, void *pointer);传递给读取回调的指针
要传递给文件读取函数的数据指针
curl_easy_setopt(CURL *handle, CURLOPT_PROGRESSFUNCTION,progress_callback);进度表回调
int progress_callback(void *clientp, double dltotal, double dlnow, double ultotal,double ulnow);函数原型
该函数由ibcurl调用,而不是以频繁的间隔调用
curl_easy_setopt(CURL *handle, CURLOPT_TIMEOUT, long timeout);允许传输完成的最长时间
传递包含超时的long as 参数,允许libcurl传输操作花费的最长时间,
curl_easy_setopt(CURL *handle, CURLOPT_FOLLOWLOCATION, long enable);重定向URL
设置为1的长参数告诉库遵循服务器在3XX响应中作为HTTP标头的一部分发送的任何location标头
2.4同步执行文件传输curl_easy_perform(CURL *easy_handle);
以阻塞方式执行整个请求,并在完成后返回,如果失败,则更早返回
2.5结束一个libcurl curl_easy_cleanup(CURL *handle);
2.6重置一个libcurl会话句柄的所有选项 curl_easy_reset(CURL *handle);
将以前在指定CURL句柄上设置的所有选项重新初始化为默认值,这会将句柄恢复到与刚刚使用curl_easy_init创建句柄时相同的状态
2.7返回错误代码的字符串 const char *curl_easy_strerror(CURLcode errornum);
fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res));
3、Libcurl的多接口的函数
3.1 CURLM *curl_multi_init();创建多控点
此函数返回指向CURLM句柄的指针,以用作所有其他多功能函数的输入
multi_handle = curl_multi_init();
3.2curl_multi_add_handle(CURLM *multi_handle, CURL *easy_handle);向多堆栈添加标准的简易手柄
3.3curl_multi_perform(CURLM *multi_handle, int *running_handles);从简单的句柄读取/写入可用数据
此函数以非阻塞方式对所有需要注意的添加句柄执行传输
int still_running;
do {
CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
if(!mc && still_running)
/* wait for activity, timeout or "nothing" */
mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
if(mc) {
fprintf(stderr, "curl_multi_poll() failed, code %d.\n", (int)mc);
break;
}
/* if there are still transfers, loop! */
} while(still_running);
3.4CURLMsg *curl_multi_info_read(CURLM *multi_handle, int *msgs_in_queue);
询问多句柄是否有来自各个传输的消息
消息可能包含传输中的错误代码或仅传输已完成的事实
int msgq = 0;
m = curl_multi_info_read(multi_handle, &msgq);
3.5CURLMcode curl_multi_remove_handle(CURLM *multi_handle, CURL *easy_handle);从多会话中删除简单句柄
从multi_handle中删除给定的easy_handle
这将使得指定的简易句柄从此多句柄的控件中删除
curl_multi_remove_handle(multi_handle, msg->easy_handle);
3.6 void curl_easy_cleanup(CURL *handle);结束一个libcurl
4、Libcurl的共享接口的函数
添加了共享接口允许在curl句柄之间共享数据
一组数据-多次传输:可以使得多个简易句柄之间共享数据,他们更新并使用相同的cookie数据库
使用curl_share_init创建共享对象,返回新的创建句柄
可以使用curl_share_setopt告诉共享对象您希望它共享哪些数据
制作简单句柄来使用此共享,curl_easy_setopt设置CURLOPT_SHARE选项,并传入共享句柄,可以使任意数量的简易句柄共享相同的共享句柄
若要终止共享特定的数据,则可以使用CURLSHOPT_UNSHARE
4.1CURLSH *curl_share_init();此函数返回指向CURLSH句柄,已用作所有其他共享函数的输入,有时在文档中的某些位置称为共享句柄
curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
4.2CURLSHcode curl_share_setopt(CURLSH *share, CURLSHoption option, parameter);设置共享对象的选项
将选项设置为给定共享的参数
4.3CURLSHcode curl_share_setopt(CURLSH *share, CURLSHOPT_LOCKFUNC, lockcb);互斥锁回调
为共享对象设置互斥锁回调,以允许多个线程同时使用它
再次释放互斥锁时会调用相应的CURLSHOPT_UNLOCKFUNC回调
5、Libcurl的网络地址解析接口
URL接口提供用于解析和生成URL的函数
5.1 创建一个句柄,其中包含URL信息和资源
CURLU *h = curl_url();
5.2 完成后,用curl_url_cleanup清理它
curl_url_cleanup(h);
//函数原型
void curl_url_cleanup(CURLU *handle);
5.3 需要句柄的副本的时候,使用curl_url_dup 复制它
CURLU *nh = curl_url_dup(h);
函数原型
复制给定的CURLU句柄及其所有内容,并返回指向新CURLU句柄的指针,新手柄也需要通过curl_url_cleanup释放
5.4 解析和重定向
通过使用 curl_url_set 将URL设置为句柄,将分析该URL并将其存储在句柄中
CURLUcode curl_url_set(CURLU *url,CURLUPart part,const char *content,unsigned int flags)
部件
CURLUPART_URL
CURLUPART_SCHEME
CURLUPART_USER
CURLUPART_PASSWORD
CURLUPART_OPTIONS
CURLUPART_HOST
CURLUPART_PORT
CURLUPART_PORT
5.5获取网址
CURLU句柄表示一个URL,可以使用curl_url_get轻松提取文章来源:https://www.toymoban.com/news/detail-858542.html
char *url;
rc = curl_url_get(h, CURLUPART_URL, &url, 0);
curl_free(url);
CURLUcode curl_url_get(CURLU *url,CURLUPart what,char **part,unsigned int flags)函数原型
部件 :CURLUPART_URL
CURLUPART_USER
CURLUPART_OPTIONS 是一个可选字段,仅在解析以下方案的URL事识别/使用它
CURLUPART_PASSWORD
CURLUPART_USER
CURLUPART_SCHEME
CURLUPART_HOST 主机名,如果是IPV6数字地址,则区域ID将不是其中的一部分
IPV6名称在设置时会规范化,这将使他们尽可能短,同时保持正确的语法
CURLUPART_PATH 即使URL中未提供路径,该部分也将为/
CURLUPART_PORT 端口不能在获取时进行URL解码,与其他部分一样,此数字以字符串形式返回文章来源地址https://www.toymoban.com/news/detail-858542.html
到了这里,关于CURL开源库的学习及编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!