/*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)错误描述
*
*
*
*
*
*/