最近开发的游戏之中需要用到大量的客户端与服务端交互的 东西,开始参考大量的技术文章,感觉是五花八门,眼花缭乱。到后面,真正感受到,学习一门技术,还是需要从它最开始的东西开始学起,要不就是一头雾水,这种感觉实在是太难受了。而且建议要学习技术的人,直接去官网学习,反而是最高效的途径。

curl的官网地址是:http://curl.haxx.se/

好的,现在开始介绍下curl这个强大的工具。

curl是一个基于命令行的应用工具,提供利用URL标准进行文件传输的功能。目前已经支持非常多的流行的互联网协议,如:FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS and FILE等。curl支持SSL认证,HTTP POST/PUT,FTP上传,HTTP上传、代理、cookies、用户+密码认证、文件续传、代理管道等一系列强大功能。curl是用C语言写的,但是绑定了很多开发语言。大体上可以把curl分成命令行工具和libcurl库两个部分,命令行工具可以直接输入指令完成相应功能,libcurl则是一个客户端URL传输库,是线程安全且兼容IPv6,可以非常方便地用来做相关开发。

curl可以使用命令行直接操作,也可以使用libcurl库进行上层应用的开发。我们这里主要讲解libcurl库的使用。使用环境是mac系统,xcode编译环境和cocos2d-X游戏引擎。
   
       libcurl提供了一组C语言API函数直接调用。首先需要提到的两个函数就是curl_global_init()和curl_global_cleanup()。libcurl要用到一系列的全局常量,curl_global_init()函数就是初始化这些变量,并分配一些全局资源;curl_global_cleanup()则负责释放这些资源。因此一般情况下,在调用libcurl函数之前,先用curl_global_init(CURL_GLOBAL_ALL)做初始化,在调用完毕后,用curl_global_cleanup()
退出。需要注意的是,这些全局变量和资源并不是线程安全的,因此,在多线程应用的环境中,最好不要多次调用curl_global_init()和curl_global_cleanup(),调用其他函数并不会改变这些全局变量和资源。
    libcurl支持3种不同的接口调用方式,分别是"easy"、"multi"和"share"模式。libcurl-easy是一组同步接口,函数都是curl_easy_*形式,这种模式调用curl_easy_perform()函数进行URL数据传输,直到传输完成函数才返回;libcurl-multi是一组异步接口,函数都是curl_multi_*形式,调用curl_multi_perform()函数进行传输,但是每次调用只传一片数据,我们可以用select()函数控制多个下载任务进行同步下载,来实现在一个线程中同时下载多个文件;libcurl-share允许在多线程中操作共享数据。下面以libcurl-easy为例讲一下libcurl的函数。
  
    1、CURL *curl_easy_init()
    此函数需要最先被调用,返回CRUL easy句柄;后续其他函数调用都要用到这个句柄。如果没有调用curl_global_init(),该函数自动调用,但是考虑到线程安全的问题,最好自己调用curl_global_init()。

2、CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter)
    所有参数和选项设置都是通过这个函数完成的,它告诉libcurl怎样去进行传输。参数handle即为curl_easy_init()返回的句柄,后面根据option的类型,设置相应的parameter值,该函数每次调用只能设置一个选项。具体的option讲解在这篇博文中有较全面的介绍:
  
    CURLOPT_URL
    字符串类型,该选项设置要处理的URL地址,该选项是进行curl_easy_perform之前唯一必须要设置的选项。
  
    CURLOPT_COOKIE
    字符串类型,设置http头中的cookie信息。
  
    CURLOPT_COOKIEFILE
    字符串类型,同CURLOPT_COOKIE,不过cookie信息从文件中读取。
  
    CURLOPT_FOLLOWLOCATION
    布尔值类型,该参数设置为非零值表示follow服务器返回的重定向信息。
  
    CURLOPT_POSTFIELDS
    字符串类型,提交http的post操作字符串数据。
  
    CURLOPT_TIMEOUT
    long数值类型,设置函数执行的最长时间,时间单位为s。
  
    CURLOPT_CONNECTTIMEOUT
    long数值类型,设置连接服务器最长时间,时间单位为s;当置为0时表示无限长。
  
    CURLOPT_MAX_RECV_SPEED_LARGE
    curl_off_t类型数据,指定下载过程中最大速度,单位bytes/s。
  
    CURLOPT_HEADERFUNCTION
    函数指针类型,该选项设置一个处理接收到的header数据的回调函数,函数原型为:
    size_t function( void *ptr, size_t size, size_t nmemb, void *stream);
    其中,ptr指向接收到的header头数据,数据大小为size*nmemb,stream指向调用CURLOPT_WRITEHEADER选项设置的参数。该回调函数应返回实际处理的数据量大小,或者出错返回-1。

CURLOPT_WRITEFUNCTION
    函数指针类型,该选项设置一个处理接收到的下载数据的回调函数,函数原型为:
    size_t function( void *ptr, size_t size, size_t nmemb, void *stream);
    其中,ptr指向接收到的数据,数据大小为size*nmemb,stream指向调用CURLOPT_WRITEDATA选项设置的参数。
    如果函数指针置为NULL,则会调用默认的函数,将数据写入到由CURLOPT_WRITEDATA指定的FILE*中。
  
    CURLOPT_HTTPHEADER
    curl_slist结构体类型,该选项自定义请求头信息。
  
    CURLOPT_NOPROGRESS
    布尔值类型,设置该值为非零值关闭PHP为CRUL传输显示的进度条。
  
    3、void curl_easy_reset(CURL *handle )
    重新初始化CURL句柄的选项设置。
  
    4、CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... )
    查询CRUL会话的内部信息,具体说明请参考curl自带文档。
  
    5、void curl_easy_cleanup(CURL * handle )
    该函数与curl_easy_init函数成对出现,handle即为调用curl_easy_init返回的句柄。该函数在CURL会话结束退出时调用,之后handle无效。

CURL使用的更多相关文章

  1. 在PowerShell中使用curl(Invoke-WebRequest)

    前言 习惯了windows的界面模式就很难转去命令行,甚至以命令行发家的git也涌现出各种界面tool.然而命令行真的会比界面快的多,如果你是一个码农. situation:接到需求分析bug,需要访 ...

  2. php中实现的一个curl批处理的实例

    curl是利用URL语法在命令行方式下工作的开源文件传输工具 本文在php中实现了的一个curl批处理的实例. 代码如下: header("Content-Type:text/html;ch ...

  3. PHP curl 函数

    转载http://sunking.sinaapp.com/archives/111 最近使用curl的时候,发现了一个比较好用的函数,当然是初级者适用的一个函数,就是curl_getinfo(), 在 ...

  4. curl -w,–write-out参数详解

    顾名思义,write-out的作用就是输出点什么.curl的-w参数用于在一次完整且成功的操作后输出指定格式的内容到标准输出. 输出格式由普通字符串和任意数量的变量组成,输出变量需要按照%{varia ...

  5. CURL HELP

    CURL下载 在windows的系统环境变量中,将CURL的路径(curl.exe存放的路径)复制到"Path"变量的结尾 Usage: curl [options...] < ...

  6. curl的登录总结

    demo1 <?php $curl=curl_init('http://www.baidu.com'); curl_exec($curl); curl_close($curl); ?> c ...

  7. php curl获取的数据不直接输出

    curl获取页面内容,不直接输出到页面 必需设置curl的CURLOPT_RETURNTRANSFER选项为1或true curl_setopt($ch, CURLOPT_RETURNTRANSFER ...

  8. PHP的CURL

    使用CURL完成一个请求: 初始化连接句柄 设置CURL选项 执行并获取结果 释放CURL连接句柄 发送GET请求 function doGetRequest($url,$data,$timeout ...

  9. PHP curl报错“Problem (2) in the Chunked-Encoded data”解决方案

    $s = curl_init(); curl_setopt($s, CURLOPT_POST, true); curl_setopt($s, CURLOPT_POSTFIELDS, $queryStr ...

  10. php获得远程信息到本地使用的3个函数:file_get_contents和curl函数和stream_get_contents

    1:file_get_contents echo file_get_contents("http://www.php.com/index.php");   2:curl funct ...

随机推荐

  1. hihocoder #1301 : 筑地市场 数位dp+二分

    题目链接: http://hihocoder.com/problemset/problem/1301?sid=804672 题解: 二分答案,每次判断用数位dp做. #include<iostr ...

  2. Eclipse中的Web项目自动部署到Tomcat(转)

    转自:http://www.cnblogs.com/ywl925/p/3815173.html 问题: 这里就有个问题,是怎么把Eclipse中的网站项目自动部署到tomcat中.在Eclipse中做 ...

  3. Microsoft SQLServer有四种系统数据库

    Microsoft SQLServer有四种系统数据库: 1.master数据库 master数据库记录SQLServer系统的所有系统级别信息.它记录所有的登录帐户和系统配置设置.master数据库 ...

  4. .NET中数据集的强类型化

    我们知道,每一种程序设计语言都提供一定的类型检查,类型检查可以在编译时进行,也可以在运行时进行,分别称做静态类型检查和动态类型检查.由于静态类型的检查是在编译时进行,实现比较容易,能提高程序的运行效率 ...

  5. Restore IP Addresses

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  6. POJ 1716

    #include <iostream> #include <algorithm> #define MAXN 20005 using namespace std; int _m[ ...

  7. 让DJANGO里的get_success_url定义的reverse_lazy带参数跳转

    按一般的CBVS实现,这个是编辑UPDATEVIEW完成之后,跳到LISTVIEW的. 但如果带跳到DETAILVIEW,则reverse_lazy需要带上参数进行跳转. 实现预定义的PK键跳转代码如 ...

  8. mac 安装mysql 报错“ERROR 2002 (HY000): Can not connect to local MySQL server through socket '/tmp/mysql.sock' (2)” 解决办法

    首先安装 homebrew 再 brew install mysql 之后连接 mysql 无论是登录还是修改初始密码都会报如下的错误 ERROR 2002 (HY000): Can not conn ...

  9. Hibernate逍遥游记-第12章 映射值类型集合-004映射Map(<map-key>)

    1. 2. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate ...

  10. C++:成员运算符重载函数和友元运算符重载函数的比较

    5.2.4 成员运算符重载函数和友元运算符重载函数的比较 (1)对双目运算符而言,成员运算符重载函数参数表中含有一个参数,而友元运算符重载函数参数表中有两个参数:对于单目运算符而言,成员运算符重载函数 ...