libcurl快速入门


/*libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议>。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。想要知道更多关于libcurl的介绍,可以到官网 http://curl.haxx.se/上去了解,在这里不再详述>。*/

/*https://blog.csdn.net/qq_39937902/article/details/84401796*/

/*在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输
前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能。下面是利用libcurl完成传输任务的流程:
 * 1.       调用curl_global_init()初始化libcurl
 * 2.       调用curl_easy_init()函数得到 easy interface型指针
 * 3.       调用curl_easy_setopt()设置传输选项
 * 4.       根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务
 * 5.       调用curl_easy_perform()函数完成传输任务
 * 6.       调用curl_easy_cleanup()释放内存
 * 在整过过程中设置curl_easy_setopt()参数是最关键的,几乎所有的libcurl程序都要使用它. */

/*
 * CURLcode curl_global_init(long flags);
 * 参数:
 *     flags:
 *     CURL_GLOBAL_ALL             //初始化所有的可能的调用。
 *     CURL_GLOBAL_SSL             //初始化支持 安全套接字层。
 *     CURL_GLOBAL_WIN32           //初始化win32套接字库。
 *     CURL_GLOBAL_NOTHING         //没有额外的初始化。
 * 注意:这个函数与curl_global_cleanup对应,只调用一次.默认自动调用,多线程时要防止被多次调用,因此要
手动调用.
 *
 * void curl_global_cleanup(void);
 * 注意:同上.
 *
 * char *curl_version();
 * 打印当前libcurl版本号.
 *
 * CURL *curl_easy_init();
 * 初始化CURL句柄,与curl_easy_cleanup对应
 *
 * void curl_easy_cleanup(CURL *handle);
 * 销毁句柄
 *
 * CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
 * 描述: 这个函数最重要了.几乎所有的curl 程序都要频繁的使用它.它告诉curl库.程序将有如何的行为. 比
如要查看一个网页的html代码等.(这个函数有些像ioctl函数)参数:
 * 参数:
 *     1 CURL类型的指针
 *     2 各种CURLoption类型的选项.(都在curl.h库里有定义,man 也可以查看到)
 *     3 parameter 这个参数 既可以是个函数的指针,也可以是某个对象的指针,也可以是个long型的变量.它
用什么这取决于第二个参数.
 *
 * CURLcode curl_easy_perform(CURL *handle);
 * 描述:这个函数在初始化CURL类型的指针 以及curl_easy_setopt完成后调用. 就像字面的意思所说perform>就像是个舞台.让我们设置的option运作起来.
 * 参数:
 *     CURL类型的指针.
 *
 *
 *--------------------------------------------------------------------------
 * CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
 * 参数:
 *     options:
 *     1,CURLOPT_URL 
 *         设置访问URL
 *
 *     2,CURLOPT_WRITEFUNCTION
 *         回调函数:size_t function( void *ptr, size_t size, size_t nmemb, void *stream);
 *     CURLOPT_WRITEDATA
 *         CURLOPT_WRITEFUNCTION的数据来源,对应回调函数里的void *ptr指针.
 *
 *     3,CURLOPT_HEADERFUNCTION:
 *         回调函数:size_t function( void *ptr, size_t size,size_t nmemb, void *stream);
 *         libcurl一旦接受到http头部数据将调用该函数.
 *     CURLOPT_HEADERDATA:
 *         CURLOPT_HEADERFUNCTION的数据来源,对应回调函数里的void *ptr指针.
 *         
 *     4,CURLOPT_READFUNCTION
 *         回调函数:size_t function(void *ptr, size_t size, size_t nmemb,void *stream);
 *         libcurl将需要读取的数据传递给远程主机时调用该函数.
 *     CURLOPT_READDATA
 *         CURLOPT_READFUNCTION的数据来源,对应回调函数里的void *ptr指针.
 *
 *     5,CURLOPT_NOPROGRESS,CURLOPT_PROGRESSFUNCTION,CURLOPT_PROGRESSDATA
 *         跟数据传输相关的参数.
 *         CURLOPT_PROGRESSFUNCTION:回调函数是进度条响应并刷新函数.一秒一次.
 *         CURLOPT_NOPROGRESS:false:进度条函数生效.
 *         CURLOPT_PROGRESSDATA:进度条函数的void *ptr指针.
 *     6,CURLOPT_TIMEOUT,CURLOPT_CONNECTIONTIMEOUT:
 *         前者设置传输时间,后者设置连接等待时间.
 *     7,CURLOPT_FOLLOWLOCATION:
 *         设置重定位URL.
 *     8,CURLOPT_RANGE: CURLOPT_RESUME_FROM:
 *         断点续传相关设置.
 *         CURLOPT_RANGE:指明http域的range头域
 *         头500bytes:bytes=0-499
 *         第二个500 :bytes=500-999
 *         最后的500 :bytes=-500
 *         500到最后 :bytes=500-
 *         第一和最后:bytes=0-0,-1  #即第0个到第0个,和最后1个byte
 *         CURLOPT_RESUME_FROM:传递一个long参数给libcurl,开始传输的偏移量
 *     9,CURLOPT_NOSIGNAL: 多线程中,DNS解析超时时,会发生"糟糕"的情况,此宏可预防这种情况.
 *         curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
 *         副作用:解析采用的是alarm(),不支持毫秒级超时,.但禁掉后,DNS解析将不受超时限制:DNS hang on,不返回超时信号.万一超时,程序可能会出现问题.
 *         解决方法:可以让libcurl使用c-ares(C library for asynchronous DNS requests)来做名字解析. 具体的可以在config curl的时候 
 *                 ./configure --enable-ares[=PATH]
 *
 *     curl_easy_perform:返回值: 0正确非0出错
 *         CURLE_OK 正确
 *         CURLE_UNSUPPORTED_PROTOCOL 不支持的协议
 *         CURLE_COULDNT_CONNECT 不能连接到remote host
 *         CURLE_REMOTE_ACCESS_DENIED 访问被拒绝
 *         CURLE_HTTP_RETURNED_ERROR http返回错误
 *         CURLE_READ_ERROR 读本地文件错误
 *         const char *curl_easy_strerror(CURLcode errornum)错误描述
 *
 *
 *
 *     
 *
 */

 

你可能感兴趣的:(libcurl)