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

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. Entity Framework 基础

    在忙碌中渡过了5,6,7 月份,现在些抽点时间对Entity Framework的使用做一些基础的回忆. Entity Framework 是什么? Entity Framework(EF)和我们所熟 ...

  2. uuid-不好之处

    数据库中直接存储UUID的坏处: 完全‘随机’的字符串,例如由MD5().SHA1().UUID()产生的.它们产生的每一个新值都会被任意地保存在很大的空间范围内, 这会减慢INSERT及一些SELE ...

  3. NGINX的奇淫技巧 —— 5. NGINX实现金盾防火墙的功能(防CC)

    NGINX的奇淫技巧 —— 5. NGINX实现金盾防火墙的功能(防CC) ARGUS 1月13日 发布 推荐 0 推荐 收藏 2 收藏,1.1k 浏览 文章整理中...... 实现思路 当服务器接收 ...

  4. 2013年山东省第四届ACM大学生程序设计竞赛 Alice and Bob

      Alice and Bob Time Limit: 1000ms   Memory limit: 65536K 题目描述 Alice and Bob like playing games very ...

  5. nohup 程序名 & (使程序推到后台运行,即使终端关闭,该程序依然运行)

    IshallbeThatIshallbe:~ iamthat$ ps -ef |grep ping 502 450 1 0 9:30PM ?? 0:00.05 ping www.baidu.com 5 ...

  6. QAQ数论模板笔记√

    #include <cstdio> using namespace std; long long gcd(long long a, long long b) { // (a, b) ret ...

  7. org.apache.common.io-FileUtils详解

    org.apache.common.io---FileUtils详解 getTempDirectoryPath():返回临时目录路径; public static String getTempDire ...

  8. Android:储存方式之SharePreferences

    使用SharedPreferences保存数据,其实质是采用了xml文件存放数据, 存储位置:/data/data/<package name>/shared_prefs 写入: publ ...

  9. Spring IoC — 基于注解的配置

    基于XML的配置,Bean定义信息和Bean实现类本身是分离的,而采用基于注解的配置方式时,Bean定义信息即通过在Bean实现类上标注注解实现. @Component:对类进行标注,Spring容器 ...

  10. [Mongo] error inserting documents: BSONObj size is invalid (mongoimport mongorestore 数据备份恢复)

    解决办法如下, ./mongoimport -port 6066 -d xxx -c xxx --batchSize=10 /root/mong_data/test/xxx 原因转自 http://b ...