美文网首页
libcurl使用介绍

libcurl使用介绍

作者: smallest_one | 来源:发表于2018-07-24 19:08 被阅读290次

    目录

    1. 参考
    2. curl介绍
    3. libcurl-easy的API介绍
    4. 注意事项

    1. 参考

    2. curl介绍

    curl是用C语言写的,提供使用URL进行文件传输的功能。目前已经支持非常多的流行的互联网协议,如:FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS 和 FILE等。curl支持SSL认证,HTTP POST/PUT,FTP上传,HTTP上传、代理、cookies、用户+密码认证、文件续传、代理管道等一系列强大的功能。

    curl可以分成命令行工具和libcurl两个部分,命令行工具可以直接输入指令完成相应功能,libcurl则是一个URL传输库,线程安全且兼容IPv6,并且使用方便。

    libcurl支持3种不同的模式,分别是"easy"、"multi"和"share"模式。

    1. libcurl-easy是一组同步接口,函数都是curl_easy_*形式,这种模式调用curl_easy_perform()函数进行URL数据传输,直到传输完成函数才返回。
    2. libcurl-multi是一组异步接口,函数都是curl_multi_*形式,调用curl_multi_perform()函数进行传输,但是每次调用只传一片数据,我们可以用select()函数控制多个下载任务进行同步下载,来实现在一个线程中同时下载多个文件。
    3. libcurl-share允许在多线程中操作共享数据。

    下面主要讲libcurl-easy的使用方式。

    3. libcurl-easy的API介绍

    分以下两部分进行介绍:

    1. 基础使用流程
    2. 其他常用功能

    3.1 基础使用流程

    基础的一些方法如下:

    curl_global_init()
    curl_easy_init()
    curl_easy_reset(CURL * handle)
    curl_easy_setopt(CURL * handle, CURLOPT_URL,)
    curl_easy_setopt(CURL *handle, CURLOPT_WRITEFUNCTION, write_callback)
    curl_easy_setopt(CURL *handle, CURLOPT_WRITEDATA, void *pointer)
    curl_easy_setopt(CURL * handle, CURLOPT_POSTFIELDS,)
    curl_easy_setopt(CURL *handle, CURLOPT_HTTPHEADER, struct curl_slist *headers)
    curl_easy_setopt(CURL *handle, CURLOPT_CONNECTTIMEOUT, timeout_seconds)
    curl_easy_setopt(CURL *handle,   CURLOPT_USERAGENT, "libcurl-agent/1.0")
    curl_easy_perform(CURL * handle)
    curl_easy_cleanup(CURL * handle)
    curl_global_cleanup()
    
    • curl_global_init()、curl_global_cleanup():
      curl_global_init()函数是初始化一系列全局变量,并分配一些全局资源,在调用libcurl函数之前,先调用curl_global_init(CURL_GLOBAL_ALL)做初始化;在调用完毕后,用curl_global_cleanup()则释放这些资源。

    • CURL *curl_easy_init():
      此函数需要最先被调用,返回CRUL easy句柄;后续其他函数调用都要用到这个句柄。如果没有调用curl_global_init(),该函数自动调用,但是考虑到线程安全的问题,最好自己调用curl_global_init()。

    • void curl_easy_reset(CURL *handle ):
      重新初始化CURL句柄的选项设置。

    • CURLcode curl_easy_setopt(CURL * handle, CURLOPT_URL,):
      字符串类型,设置要处理的URL。

    • CURLcode curl_easy_setopt(CURL * handle, CURLOPT_POSTFIELDS,):
      字符串类型,提交http的post操作字符串数据。

    • CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPHEADER, struct curl_slist *headers):
      自定义请求头信息。

    • CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEFUNCTION, write_callback):
      注册写回调函数

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEDATA, void *pointer);
    size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata);
    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEFUNCTION, write_callback)
    
    • CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECTTIMEOUT,timeout_seconds):
      设置连接耗时。

    • CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEOUT, timerout_seconds):
      设置传输耗时。

    • CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERAGENT, "libcurl-agent/1.0")

    • CURLcode curl_easy_perform(CURL * handle):
      执行数据传输。

    • void curl_easy_cleanup(CURL * handle):
      该函数与curl_easy_init函数成对出现,handle即为调用curl_easy_init返回的句柄。该函数在CURL会话结束退出时调用,之后handle无效。

    3.2 其他常用功能

    • CURLcode curl_easy_setopt(CURL *handle, CURLOPT_VERBOSE, long onoff):
      获取verbose信息。

    • CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADERFUNCTION, header_callback):
      接收header数据。

    • CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FOLLOWLOCATION, long enable):
      布尔值类型,该参数设置为非零值表示follow服务器返回的重定向信息。

    size_t header_callback(char *buffer, size_t size, size_t nitems, void *userdata);
    //其中,ptr指向接收到的header头数据,数据大小为size*nmemb,
    //stream指向调用CURLOPT_WRITEHEADER选项设置的参数。
    //该回调函数应返回实际处理的数据量大小,或者出错返回-1。
    
    • curl_easy_setopt(CURL *handle, CURLOPT_NOPROGRESS, false):
      设为false 下面才能设置进度响应函数。

    • CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROGRESSFUNCTION, progress_callback):

    int progress_callback(void *clientp,   double dltotal,   double dlnow,   double ultotal,   double ulnow);
    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROGRESSDATA, void *pointer);
    
    • CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... ):
      查询CRUL会话的内部信息,具体说明请参考参考文档

    4. 注意事项

    • curl_global_init()初始化的全局变量和资源并不是线程安全的,因此,在多线程应用的环境中,不要多次调用curl_global_init()和curl_global_cleanup()。
    • 调用curl_easy_init()的时候,如果没有调用curl_global_init(),该函数自动调用,但是考虑到线程安全的问题,最好自己调用curl_global_init()。

    相关文章

      网友评论

          本文标题:libcurl使用介绍

          本文链接:https://www.haomeiwen.com/subject/gheymftx.html