libcurl使用 联系客服

发布时间 : 星期五 文章libcurl使用更新完毕开始阅读be14da36f705cc175427098b

最后要说明的是,所有在easy handle上设置的属性都是”sticky”的,什么意思?就是说在easy handle上设置的属性都将被保存,即使执行完curl_easy_perform之后,这些属性值仍然存在。通过将

CURLOPT_HTTPGET设为1可以使easy handle回到最原始的状态: curl_easy_setopt(easy_handle, CURLOPT_HTTPGET, 1L); 显示进度

libcurl支持通信过程中的进度控制。通过将CURLOPT_NOPROCESS设置为0开启进度支持。该选项默认值为1。对大多数应用程序,我们需要提供一个进度显示回调。libcurl会不定期的将当前传输的进度通过回调函数告诉你的程序。回调函数的原型如下:

int progress_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow);

通过CURLOPT_PROGRESSFUNCTION注册该回调函数。参数clientp是一个用户自定义指针,应用程序通过 CURLOPT_PROCESSDATA属性将该自定义指定传递给libcurl。libcurl对该参数不作任何处理,只是简单将其传递给回调函数。 在C++中使用libcurl

在C++中使用libcurl跟在C语言中没有任何区别,只有一个地方要注意:回调函数不能是类的非静态成员函数。例如:

class AClass { static size_t write_data(void *ptr, size_t size, size_t nmemb, void *ourpointer) { /* do what you want with the data */ } }

代理

什么是代理?Merrian-Webster的解释是:一个通过验证的用户扮演另一个用户。今天,代理已经被广泛的使用。许多公司提供网络代理服务器,允许员工的网络客户端访问、下载文件。代理服务器处理这些用户的请求。

libcurl支持SOCKS和HTTP代理。使用代理,libcurl会把用户输入的URL提交给代理服务器,而不是直接根据URL去访问远程资源。 当前版本的libcurl并不支持SOCKS代理的所有功能。

对于HTTP代理来说,即使请求的URL不是一个合法的HTTP URL(比方你提供了一个ftp的url),它仍然会先被提交到HTTP代理。 代理选项

CURLOPT_PROXY属性用于设置libcurl使用的代理服务器地址: curl_easy_setopt(easy_handle, CURLOPT_PROXY, \

可以把主机名与端口号分开设置:

curl_easy_setopt(easy_handle, CURLOPT_PROXY, \curl_easy_setopt(easy_handle,

CURLOPT_PROXYPORT, \端口号是用字符串还是整数?? 有些代理服务器要求用户通过验证之后才允许接受其请求,此时应该先提供验证信息:

curl_easy_setopt(easy_handle, CURLOPT_PROXYUSERPWD, \

还要告诉libcurl使用的代理类型(如果没有提供,libcurl会认为是HTTP代理):

curl_easy_setopt(easy_handle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4); 环境变量

对于有些协议,libcurl会自动检测并使用一些环境变量,并根据这些环境变量来确定要使用的代理服务器。这些环境变量的名称格式一般是” [protocol]_proxy”(注意小写)。例如输入一个HTTP的URL,那么名称为”http_proxy”的环境变量就会被检测是否存在,如果存在,libcurl会使用该环境变量指定的代理。相同的规则也适用于FTP。 这些环境变量的值的格式必须是这样

的:”[protocol://][user:password@]machine[:port]“。libcurl会忽略掉[protocol://],如果没有提供端口号,libcurl使用该协议的默认端口。 有两个比较特殊的环境变量:?all_proxy?与?no_proxy?。如果一个URL所对应的协议,它的环境变量没有设置,那么 ?all_proxy?指定的代理将被使用。?no_proxy?则指定了一个不应被使用的代理主机的列表。例如:no_proxy的值是 ?192.168.1.10′,即使存在http_proxy,它的值也是?192.168.1.10′,?192.168.1.10′也不会被作为代理。no_proxy=”*”表示不允许使用任何代理。

显式地将CURLOPT_PROXY属性设置为空,可以禁止libcurl检查并使用环境变量来使用代理。 SSL和代理

SSL为点到点通信提供安全保障。它包含一些强壮的加密措施和其他安全检测,这使得上面讲到的代理方式不适用于SSL。除非代理服务器提供专用通道,对进出该代理服务器的数据不作任何检测或禁止。通过HTTP代理服务器打开SSL连接,意味着代理服务器要直接连接到目标主机的指定端口。因为代理服务器对在专用通道上传输的数据的类型毫无所知,所以它往往会使某些机制失效,如缓存机制。许多组织只允许在443端口上创建这种类型的数据通道。 代理通道(Tunneling Through Proxy)

正如上面讲到的,要使SSL工作必须在代理服务器创建专用数据通道,通常专用通道只被限制应用于HTTPS。通过HTTP代理在应用程序与目标之间创建一个专用数据通道,应该预防在该专有通道上执行非HTTP的操作,如进行FTP上传或执行FTP命令。代理服务器管理员应该禁止非法的操作。

通过CURLOPT_HTTPPROXYTUNNEL属性来告诉libcurl使用代理通道:

curl_easy_setopt(easy_handle, CURLOPT_HTTPPROXYTUNNEL, 1L);