zoukankan      html  css  js  c++  java
  • 初学libcurl

    http://www.cnblogs.com/wing-h/p/3263488.html

    最近想把某网站上的些数据download下来,在网上找到了cURL,正好来边学边弄一下!

      

    下载libcurl源代码


    cURL的官网是http://curl.haxx.se/ ,直接下载源代码包来编译吧 ,在download里面有源代码下在,最新版是curl-7.32.0(http://curl.haxx.se/download/curl-7.32.0.tar.gz)。

    MinGw下编译libcurl


    1. 解压文件。
    2. 通过命令行进入到curl-7.32.0目录下。
    3. 键入 mingw32-make mingw32 编译生成。

    libcurl的使用


    libcurl是开源的url传输库,支持 FTP、HTTP等协议。我用C语言来实现。curl的接口有很多,目前libcurl-easy接口的功能就足够强大,够完成我的要求了,所以这里就研究下libcurl-easy里的函数就行了,其他的以后用到在研究。

    一般curl的使用流程:

    1 curl_easy_init();        //初始化curl对象
    2 curl_easy_setopt();        //设置curl对象的行为
    3 curl_easy_perform();        //执行操作
    4 curl_easy_cleanu p();        //关闭curl        

    <culr/curl.h>中的部分函数:

    1、 CURLcode curl_global_init(long flags);

    该函数必须在调用其他curl函数之前调用。只需调用一次,调用多次和一次一样。

    该函数是非线程安全的,所以不可以在它运行时,在其他线程调用它。

    如果在使用curl_easy_init()函数之前未调用curl_global_init()函数,程序将自动调用。

    参数:

    CURL_GLOBAL_ALL   初始化除CURL_GLOBAL_ACK_EINTR外的所有系统。

    CURL_GLOBAL_SSL   初始化SSL

    CURL_GLOBAL_WIN32   初始化Win32 socket libraries.

    CURL_GLOBAL_NOTHING   不初始化任何系统

    CURL_GLOBAL_DEFAULT   等同于CURL_GLOBAL_ALL 

    CURL_GLOBAL_ACK_EINTR   设置了这个标签后,当curl在连接或等待数据请求时,curl将接收EINTR条件,否则,curl会一直等待。

    返回值:

    正常通过时返回0,非零值表示出现错误。

    2、void curl_global_cleanup(void);

    该函数释放由curl_global_init()函数请求的资源。

    该函数必须在curl_global_init()函数之后调用,关闭curl库之前必须调用。

    该函数也是非线程安全的。

     

    3、CURL *curl_easy_init( );

    该函数初始化生成一个curl的指针,该指针用做其他easy函数的输入。

    该函数必须和curl_easy_clean()函数一起使用。

    如果在调用该函数之前,你没有调用curl_global_init()进行初始化,系统将会自动调用curl_global_init()函数。

    但建议你最好不用让系统自动调用该函数,因为可能会忘了调用curl_global_cleanup(),而出现问题。

    所以最好手动调用curl_global_init()函数。

    返回值:

    返回一类似FILE的指针,如果返回NULL,则发生错误。

    4、void curl_easy_cleanup(CURL * handle );

    调用该函数来结束一个curl easy会话。关闭一个由curl_easy_init()生成的handle

    5、CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);

     为“easy”句柄设置一个行为。

    curl_easy_setopt()函数告诉libcurl该如何做。通过设置适当的参数,你可以改变libcurl的行为。

    基本所有的操作都是通过这个函数设置的。

    option参数是一系列的行为操作。

    parameter取决于option参数的设置。

    返回值:

    0或CURL_OK表示成功。非零值表示有错误发生。

    如果你设置了一个libcurl无法识别的行为,可能是libcurl版本过低,则将会返回 CURLE_FAILED_INIT。

    6、CURLcode curl_easy_perform(CURL * handle);

     执行会话的操作。

    该函数在curl_easy_init()函数和所有的curl_easy_setopt()函数设置完后调用,执行所有设置的操作。

    返回值:

    成功则返回0,返回non-zero则失败。如果在curl_easy_setopt()函数中设置了 CURLOPT_ERRORBUFFER ,则当返回non-zero时,在error buffer中会有可读的错误信息。

    7、CURL *curl_easy_duphandle(CURL *handle);

     克隆一个curl会话句柄。

    该函数将返回一个curl副本,拥有之前句柄的所有设置。

    新的curl句柄也必须在关闭时调用curl_easy_cleanup()函数。

    新生成的副本不会继承任何状态信息,没有连接,没有SSL,没有cookies。

    返回值:

    如果返回NULL,则表示克隆失败。

    8、char *curl_easy_escape( CURL * curl , char * url , int length);

     URL编码给定的字符串。

    该程序将输入的字符串转化为一个URL编码字符串,返回一个新生成的字符串。

    除了a-z, A-Z, 0-9, '-', '.', '_' or '~'字符外,其他字符都转为转义字符形式。

    如果length参数设为0,将自动调用strlen()函数计算url的长度作为参数。

    必须用curl_free()函数来释放字符串内存。

    返回值:

    一个指向字符串结尾的指针或者NULL表示转化失败。

    9、char *curl_easy_unescape( CURL * curl , char * url , int inlength , int * outlength);

     URL解码给定的字符串。

    所有输入的URL编码都转化成他们相对应的二进制码。

    如果inlength参数设为0,将自动调用strlen()函数计算url的长度作为参数。

    如果outlength参数为non-NULL,函数将写入返回字符串的长度。

    返回值:

    一个指向字符串结尾的指针或者NULL表示转化失败。

    10、CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);

     用来获取curl句柄的信息。

    11、CURLcode curl_easy_pause(CURL *handle , int bitmask);

     暂停或者启动一个连接。

    一个连接可以同过调用这个函数或者让读或写操作的回调函数返回 CURL_READFUNC_PAUSE 或 CURL_WRITEFUNC_PAUSE 来暂停连接。

    handle参数指向要暂停的会话。

    bitmask参数设置了连接的新状态。如下可选:

    CURLPAUSE_RECV

    停止接收数据。该会话将不会在接收数据,直到再次调用没有改位状态的该函数。

    CURLPAUSE_SEND

    停止发送数据。该会话将不会在发送数据,直到再次调用没有改位状态的该函数。

    CURLPAUSE_ALL

    停止会话的发送和接收。

    CURLPAUSE_CONT

    重启会话的发送和接收。

     

    12、CURLcode curl_easy_recv( CURL * curl , void * buffer , size_t buflen , size_t * n);

     通过一个"easy"连接接收数据。

    该函数通过建立的连接接收数据。可以和curl_easy_send()函数一起使用,通过libcurl库实现自定义的协议。

    buffer指向你要存储接收到的数据的地址。buflen是你可以从缓存中获取的数据的最大值,n将接收你所接收的数据的长度。

    如果通过设置 CURLOPT_CONNECT_ONLY 建立起连接,curl_easy_recv()函数将无法调用。

    在调用curl_easy_recv()函数之前,必须确定socket有数据可读,否则将会返回 CURLE_AGAIN 。

    通过调用curl_easy_getinfo()函数,并设置参数为 CURLINFO_LASTSOCKET 来获取socket。

    可通过系统工具 select() 检查是否有数据可读。

    返回值:

    如果成功,则返回 CURLE_OK,获得的数据将存入buffer中,而数据的大小将存入n中。

    如果失败,返回占用错误代码。

    如果没有数据可读,将返回 CURLE_AGAIN 。

    如果没有可用的socket,将返回 CURLE_UNSUPPORTED_PROTOCOL。

    13、CURLcode curl_easy_send( CURL * curl , const void * buffer , size_t buflen , size_t * n);

     通过一个"easy"连接发送数据。

    该函数通过建立的连接发送任意数据。可以和curl_easy_recv()函数一起使用,通过libcurl库实现自定义的协议。

    buffer指向你要发送的数据的地址。buflen是发送的数据的长度,n将接收你所发送的数据的长度。

    如果通过设置 CURLOPT_CONNECT_ONLY 建立起连接,curl_easy_recv()函数将无法调用。

    在调用curl_easy_send()函数之前,必须确定socket有数据可读,否则将会返回 CURLE_AGAIN 。

    通过调用curl_easy_getinfo()函数,并设置参数为 CURLINFO_LASTSOCKET 来获取socket。

    可通过系统工具 select() 检查是否有数据可读。

    返回值:

    如果成功,则返回 CURLE_OK,实际发送的数据的大小将存入n中。

    如果失败,返回占用错误代码。

    如果没有可用的socket,将返回 CURLE_UNSUPPORTED_PROTOCOL。

    14、void curl_easy_reset(CURL *handle);

     重设一个curl句柄。

    重初始化一个curl句柄,使其和刚调用curl_easy_init()函数时一样。

    无法改变句柄中的以下信息:活动中的连接,Session ID cache,DNS cache,cookies 和 share。

    15、const char *curl_easy_strerror(CURLcode errornum);

     该函数通过errornum参数,返回刚发生的错误信息的字符串。

    16、void curl_free( char * ptr );

    释放内存。

  • 相关阅读:
    druid-1.0.13 数据库配置文件密码加密
    PostConstruct注解
    easyui formatter 返回easyui组件
    小师妹问 easyUI mergeCells 行合并后表头和内容对不齐
    Java Split以竖线作为分隔符
    Integer比较值的时候小心使用
    js 关键字 in
    Asp.net中防止用户多次登录的方法
    C#取得站点跟目录
    解读支付宝接口实现步骤
  • 原文地址:https://www.cnblogs.com/youngt/p/3807549.html
Copyright © 2011-2022 走看看