精华内容
下载资源
问答
  • easy_perform 会处理返回值100的情况,即先发送头文件再发送data。 但是如果timeout (CURLOPT_TIMEOUT)时间到了,这个100返回值是会被easy_perform返回的。 转载于:...

    easy_perform 会处理返回值100的情况,即先发送头文件再发送data。

    但是如果timeout (CURLOPT_TIMEOUT)时间到了,这个100返回值是会被easy_perform返回的。

    转载于:https://www.cnblogs.com/liujx2019/p/10298207.html

    展开全文
  • libcurl - curl_easy_perform 返回值说明

    万次阅读 2016-02-17 17:06:30
    libcurl 进行http/HTTPS的get和post,根据返回值进行相应处理(比如:do something after,比如 write log)

    使用libcurl,处理业务逻辑是用到perform的返回值,为自己,为朋友们,记录一下!


    response=curl_easy_perform(curl);

    response返回的状态值


    #include <curl/curl.h>
    
    enum CURLcode
    {
        CURLE_OK = 0,
        CURLE_UNSUPPORTED_PROTOCOL, /* 1 */
        CURLE_FAILED_INIT, /* 2 */
        CURLE_URL_MALFORMAT, /* 3 */
        CURLE_OBSOLETE4, /* 4 - NOT USED */
        CURLE_COULDNT_RESOLVE_PROXY, /* 5 */
        CURLE_COULDNT_RESOLVE_HOST, /* 6 */
        CURLE_COULDNT_CONNECT, /* 7 */
        CURLE_FTP_WEIRD_SERVER_REPLY, /* 8 */
        CURLE_REMOTE_ACCESS_DENIED, /* 9 a service was denied by the server
                                            due to lack of access - when login fails
                                            this is not returned. */
        CURLE_OBSOLETE10, /* 10 - NOT USED */
        CURLE_FTP_WEIRD_PASS_REPLY, /* 11 */
        CURLE_OBSOLETE12, /* 12 - NOT USED */
        CURLE_FTP_WEIRD_PASV_REPLY, /* 13 */
        CURLE_FTP_WEIRD_227_FORMAT, /* 14 */
        CURLE_FTP_CANT_GET_HOST, /* 15 */
        CURLE_OBSOLETE16, /* 16 - NOT USED */
        CURLE_FTP_COULDNT_SET_TYPE, /* 17 */
        CURLE_PARTIAL_FILE, /* 18 */
        CURLE_FTP_COULDNT_RETR_FILE, /* 19 */
        CURLE_OBSOLETE20, /* 20 - NOT USED */
        CURLE_QUOTE_ERROR, /* 21 - quote command failure */
        CURLE_HTTP_RETURNED_ERROR, /* 22 */
        CURLE_WRITE_ERROR, /* 23 */
        CURLE_OBSOLETE24, /* 24 - NOT USED */
        CURLE_UPLOAD_FAILED, /* 25 - failed upload "command" */
        CURLE_READ_ERROR, /* 26 - couldn't open/read from file */
        CURLE_OUT_OF_MEMORY, /* 27 */
        /* Note: CURLE_OUT_OF_MEMORY may sometimes indicate a conversion error
                   instead of a memory allocation error if CURL_DOES_CONVERSIONS
                   is defined
          */
        CURLE_OPERATION_TIMEDOUT, /* 28 - the timeout time was reached */
        CURLE_OBSOLETE29, /* 29 - NOT USED */
        CURLE_FTP_PORT_FAILED, /* 30 - FTP PORT operation failed */
        CURLE_FTP_COULDNT_USE_REST, /* 31 - the REST command failed */
        CURLE_OBSOLETE32, /* 32 - NOT USED */
        CURLE_RANGE_ERROR, /* 33 - RANGE "command" didn't work */
        CURLE_HTTP_POST_ERROR, /* 34 */
        CURLE_SSL_CONNECT_ERROR, /* 35 - wrong when connecting with SSL */
        CURLE_BAD_DOWNLOAD_RESUME, /* 36 - couldn't resume download */
        CURLE_FILE_COULDNT_READ_FILE, /* 37 */
        CURLE_LDAP_CANNOT_BIND, /* 38 */
        CURLE_LDAP_SEARCH_FAILED, /* 39 */
        CURLE_OBSOLETE40, /* 40 - NOT USED */
        CURLE_FUNCTION_NOT_FOUND, /* 41 */
        CURLE_ABORTED_BY_CALLBACK, /* 42 */
        CURLE_BAD_FUNCTION_ARGUMENT, /* 43 */
        CURLE_OBSOLETE44, /* 44 - NOT USED */
        CURLE_INTERFACE_FAILED, /* 45 - CURLOPT_INTERFACE failed */
        CURLE_OBSOLETE46, /* 46 - NOT USED */
        CURLE_TOO_MANY_REDIRECTS, /* 47 - catch endless re-direct loops */
        CURLE_UNKNOWN_TELNET_OPTION, /* 48 - User specified an unknown option */
        CURLE_TELNET_OPTION_SYNTAX, /* 49 - Malformed telnet option */
        CURLE_OBSOLETE50, /* 50 - NOT USED */
        CURLE_PEER_FAILED_VERIFICATION, /* 51 - peer's certificate or fingerprint
                                             wasn't verified fine */
        CURLE_GOT_NOTHING, /* 52 - when this is a specific error */
        CURLE_SSL_ENGINE_NOTFOUND, /* 53 - SSL crypto engine not found */
        CURLE_SSL_ENGINE_SETFAILED, /* 54 - can not set SSL crypto engine as
                                            default */
        CURLE_SEND_ERROR, /* 55 - failed sending network data */
        CURLE_RECV_ERROR, /* 56 - failure in receiving network data */
        CURLE_OBSOLETE57, /* 57 - NOT IN USE */
        CURLE_SSL_CERTPROBLEM, /* 58 - problem with the local certificate */
        CURLE_SSL_CIPHER, /* 59 - couldn't use specified cipher */
        CURLE_SSL_CACERT, /* 60 - problem with the CA cert (path?) */
        CURLE_BAD_CONTENT_ENCODING, /* 61 - Unrecognized transfer encoding */
        CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */
        CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */
        CURLE_USE_SSL_FAILED, /* 64 - Requested FTP SSL level failed */
        CURLE_SEND_FAIL_REWIND, /* 65 - Sending the data requires a rewind
                                            that failed */
        CURLE_SSL_ENGINE_INITFAILED, /* 66 - failed to initialise ENGINE */
        CURLE_LOGIN_DENIED, /* 67 - user, password or similar was not
                                            accepted and we failed to login */
        CURLE_TFTP_NOTFOUND, /* 68 - file not found on server */
        CURLE_TFTP_PERM, /* 69 - permission problem on server */
        CURLE_REMOTE_DISK_FULL, /* 70 - out of disk space on server */
        CURLE_TFTP_ILLEGAL, /* 71 - Illegal TFTP operation */
        CURLE_TFTP_UNKNOWNID, /* 72 - Unknown transfer ID */
        CURLE_REMOTE_FILE_EXISTS, /* 73 - File already exists */
        CURLE_TFTP_NOSUCHUSER, /* 74 - No such user */
        CURLE_CONV_FAILED, /* 75 - conversion failed */
        CURLE_CONV_REQD, /* 76 - caller must register conversion
                                            callbacks using curl_easy_setopt options
                                            CURLOPT_CONV_FROM_NETWORK_FUNCTION,
                                            CURLOPT_CONV_TO_NETWORK_FUNCTION, and
                                            CURLOPT_CONV_FROM_UTF8_FUNCTION */
        CURLE_SSL_CACERT_BADFILE, /* 77 - could not load CACERT file, missing
                                            or wrong format */
        CURLE_REMOTE_FILE_NOT_FOUND, /* 78 - remote file not found */
        CURLE_SSH, /* 79 - error from the SSH layer, somewhat
                                            generic so the error message will be of
                                            interest when this has happened */
        
        CURLE_SSL_SHUTDOWN_FAILED, /* 80 - Failed to shut down the SSL
                                            connection */
        CURLE_AGAIN, /* 81 - socket is not ready for send/recv,
                                            wait till it's ready and try again (Added
                                            in 7.18.2) */
        CURLE_SSL_CRL_BADFILE, /* 82 - could not load CRL file, missing or
                                            wrong format (Added in 7.19.0) */
        CURLE_SSL_ISSUER_ERROR, /* 83 - Issuer check failed.  (Added in
                                            7.19.0) */
        CURL_LAST /* never use! */
    };

    展开全文
  • libcurl

    2016-11-23 16:26:54
    翻译文献:libcurl官方文档libcurl库的使用部分。 libcurl 基础  命令行curl工具的核心(引擎)是libcurl, 现在他也是成千上万个用来传输互联网数据的工具,服务或者是应用的核心(引擎)。 面向传输(Transfer ...
    翻译文献:libcurl官方文档libcurl库的使用部分。

    libcurl 基础

             命令行curl工具的核心(引擎)是libcurl, 现在他也是成千上万个用来传输互联网数据的工具,服务或者是应用的核心(引擎)。

    面向传输(Transfer oriented)


            用户不需要成为网络协议方面的专家或者对网络网络或协议有很深的了解就可以方便的使用libcurl, 这是把libcurl设计为面向传输(面向传输封装的底层的协议 by Monk)的目的。 你可以设定一些传输的细节和特定的信息, 然后用libcurl来帮助你实现传输。

           也就是说,网络和协议是有许多缺陷(pitfalls)和特殊情形(special cases)的领域(areas), 所有你对这些缺陷和特殊情形了解的越多, 你就能更好的理解libcurl的选项和工作方式。 更不必说, 这些知识是无价的, 当你在debug或者当程序没有按照你设想的哪样运行。

            libcurl的简单应用场景差不多都是那么几行代码,但是绝大多数的应用是需要更多代码来完成的。

    (Simple by default, more on demand)

            libcurl默认只做一些简单基础的传输, 但是如果你想要更多高级的特性(advanced features),可以通过设置正确的选项来实现。例如, 默认的libcurl不支持http cookies,但是你可以设置运行http cookies。

           这使libcurl的行为(behaviors)易于控制(to guess and depend on), 也使得维护老版本的行为或加入新特性更容易。只有应用要求的特性才会得到相应的行为(Only applications that actually ask for and use the new features will get that behavior)。

    简单/默认的句柄(Easy handle)

             你需要学习的libcurl基础

              首先, 创建用来传输的简单句柄:

                CURL* easy_handle = curl_easy_init();

              然后,可以设置各种选项来控制上行传输(upcoming transfer)。例如,设置URL

                /* Set URL to operate on */
                res = curl_easy_setopt(easy_handle, CURLOPT_URL, "http://example.com/");

              创建简单句柄和设置选项不会使实际的传输发生,甚至不会发生任何事情,当传输真正开始时, libcurl才会存储你设置的选项(Creating the easy handle and setting options on it doesn't make any transfer happen, and usually don't even make much more happen other than libcurl storing your wish to be used later when the transfer actually occurs)。多数的语法检查和输入合法性可能被延迟, 因为 curl_easy_setopt  不会解析(complain), 但是这并不意味着输入就是正确有效的,稍后你可能会捕获到错误。

               所有这些选项都是一体的(sticky)。设置会一直留在句柄里,直到你去改变他,或者调用 curl_easy_reset() 。

                当你设置完所有想要的选项后, 你可以开始真正的传输了(fire off the actual transfer)。

               实际传输阶段(perform the transfer phase)可以用的方式和函数调用来完成, 这取决于你的应用想要什么样的行为和libcurl怎么程序架构更好的融合。这会在稍后的章节做进一步的阐述。

               在传输完成后,你可以判断传输是否成功并且提取libcurl在传输期间收集的各种静态信息(stats and various information)。

               当传输正在进行时, libcurl会调用你指定的函数--回调函数--来发送数据, 读取数据,以及其他很多事件。             

    重用(Reuse)

    简单句柄被设计(meant and designed to)为可重用。当你用简单句柄来处理单个传输,你可以了马上用他来处理另一个传输。这样做有很多的好处。

    驱动传输(“Driver” transfers)

               libcurl提供三种不同的传输方式。使用哪种方式完全取决于你自己和你的需求。

                            1. 简单的接口让你用同步的方式来实现单个传输。libcurl会完成整个传输过程然后返回不管传输是成功或是失败。

                            2. ‘multi’ 接口是用来当你同时要实现多个传输或者你想要一个非阻塞的传输机制时使用的。

                            3. ‘multi_socket’接口是是普通‘multi’接口一个特例(slight variation),但是他是基于事件的。当应用有成千上万的并发量时,‘multi_socket’是被推荐的API。

    Driving with the easy interface

              选用 'easy'这个名字仅仅是因为使用libcurl确实一个很简单, 并且限制也很少。例如,他可以使用一个函数来完成一次传输:

               res = curl_easy_perform(easy_handle);

              如果服务端很慢,或者传输数据比较大,或者有网络超时,这个函数调用可能会用很长的时间才能完成。当然, 你可以设置超时时间,在特定的条件下,这同样会花费大量的时间。

              在使用简单接口时,如果你想要你的应用程序在libcurl传输的过程时做一些其他的事情,你想要用到多线程。如果你用简单接口和多线程来实现并发传输 ,那就要在各个线程中分别实现传输(怎么看都觉得这句话是多余的,附上原文:If you want to do multiple simultaneous transfers when using the easy interface, you need to perform each of the transfers in its own thread)。

    Driving with the multi interface

            见名知意,‘multi’ 就是来实现多路复用的,在同一个线程完成所有的操作(The name ‘multi’ is for multi , as in multiple parallel transfers, all done in the same single thread.)。‘multi’ API is 非阻塞的,但是同样可以用于单个传输。

            ‘multi’传输和简单句柄一样是在“easy” CURL*句柄中设置的。但是使用‘multi’接口, 你需要CURLM* 句柄来驱动。‘multi’句柄可以处理一个或多个简单句柄:

    CURLM* multi_handle = curl_multi_init();

             ‘multi’句柄也可以通过 curl_multi_setopt() 设置具体选项,但是更为简单的方式是什么也不用设置。

               为了驱动‘multi’接口传输, 你首先要把所用的单个简单句柄都添加都‘multi’句柄中。你可以在任何时刻从‘multi’句柄中添加或删除他们。从中删除一个简单句柄同时也删除了他们之间的联系,这导致相应的传输也会立刻被终止。

               添加一个简单句柄到‘multi’句柄是非常简单的:

               curl_multi_add_handle(multi_handle, easy_handle);

              从‘multi’中删除简单句柄也是同样的简单:

                cul_multi_remove_handle(multi_handle, easy_handle);

               Having added the easy handles repersenting the transfers you want to perform , you write the transfer loop. With the multi interface, you di the looping so you can ask libcurl for a set of file descriptors and a timeout value and do the select() call yourself, or you can use the slightly simplified version which dies that for us, with curl_multi_wait.  The simplest loop would basicallu be this:(note that a real application would check return codes)

                int transfers_running;
                do{
                      curl_muitl_wait(multi_handle, NULL, 0, 1000, NULL);
                      curl_multi_perform(multi_handle, &transfers_running);
                }while(transfers_running);

                curl_multi_wait的第四个参数被设置为1000,是一个超时时间,以毫秒为单位。在函数返回前,这是他等待任何事件发生的最长时间。如果不想等待那么长的时间,可以再次调用curl_multi_perform,但是这样做会丢失精度。

                 作为替代,我们可以用select()自己实现,我们从libcurl中提取文件描述符和超时时间(在实际应用中需要需要检查返回值):  

                  int  transfers_running;
                  do{
                        fd_set fdread;
                        fd_set fdwrite;
                        fd_set fdexcep;
                        int maxfd = -1;
                        long timeout;
       
                        /* extract timeout value */
                        curl_multi_timeout(multi_handle, &timeout);
                        if(timeout < 0){
                            timeout = 1000;
                        }
                        
                        /* convert to struct usable by select */
                        timeout.tv_sec = timeout / 1000;
                        timeout.tv_usec = (timeout % 1000);
        
                        FD_ZERO(&fdread);
                        FD_ZERO(&fdwrite);
                        FD_ZERO(&fdexcep);

                        /* get file descriptors from the transfers */
                        mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
                        
                        if(maxfd == -1){
                              SHORT_SLEEP;
                        }else{
                              select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
                        }

                        /* timeout or readable/writeabke sockets */
                        curl_multi_perform(multi_handle, &transfers_running);
                  }while(transfers_running);

    Driving with the "multi_socket" interface
              "multi_socket" 是普通"multi"接口的一个特殊版本(extra spicy version),也是专门为事件驱动应用程序设计的。
              "multi_socket" 支持并发传输 - 所有的操作都在单个线程中完成(all done in the same single thread),并且支持在单个应用中实现成百上千个传输。
     
            Many easy handles
               和普通"multi"接口一样,"multi_socket"也是通过curl_multi_add_handle()把简单句柄加入到事件集合中。
               可以在任何时候从事件集合中添加和删除句柄。删除句柄和添加句柄一样的简单curl_multi_remove_handle()。但是,还是建议在传输完成(不管是成功或是失败)之后,再再从事件集合中删除句柄。
             
            Multi_socket callbacks
                正如上面所解释的,事件驱动机制依赖应用中运用了sockets的libcurl以及libcurl在等待哪些sockets是否可读或者可写。
                也需要告诉libcurl等待什么时间失效,因为libcurl不能自己设置超时时间。所以libcurl需要通知应用来更新超时时间。
           
            Socket_callback
                 libcurl给出所等待sockets事件的回调函数声明,但是需要应用来实现它。   

                       int socket_callback(CURL* easy,
                                           curl_socket_t s,
                                           int what,
                                           void* userp,
                                           void* socketp)
                       {

                               /* told about the socket 's' */
                        }

                        /* set the callback in the multi handle */
                        curl_multi_setopt(multi_handle, CURLMOPT_SOCKETFUNCTION, socket_callback);
                 这样,libcurl就设置和删除应用程序监控的sockets。应用程序通知潜在的基于事件驱动的底层系统等待事件的发生。如果多个sockets在被监控,则这个回调函数可能会被多次调用,当sockets状态发生改变的时候,回调也会被执行。

                        int running_handles;
                        ret = curl_multi_socket_action(multi_handle,
                                                       sockfd, /* the socket with activity */
                                                       ev_bitmask, /* the specific activity */
                                                       &running_handles);
               timer_callback:
                        int timer_callback(multi_handle,   /* multi handle */
                                           timeout_ms,      /* milliseconds to wait */
                                           userp)          /* private callback pointer */
                         {
                              /* new value to wait for is ... */
                          }
                           
                          /* set the callback in the multi handles */
                          curl_multi_sockopt(multi_handle, CURLMOPT_TIMERFUNCTION, timer_cb);

                          curl_multi_socket_action(multi, CURL_SOCKET_TIMEOUT, 0, running);
               How to start everything
                        当完成了事件的添加和设置,就可以开始传输了。
                        /* all easy handles and callbacks are setup */
                        curl_multi_socket_action(multi, CURL_SOCKET_TIMEOUT, 0, &running);
                        
                        /* now the callbacks should have been called and we have sockets to wait for  and possibly a timeout, too. Make the event system do it magic */
                        event_base_dispatch(event_base);  // libevent2 has this API
                        
                        /* at this point we have exited the loop */  
               When is it done?
                       curl_multi_socket_action() 会返回正在运行的事件(running handles)的计数器。当计数器变为零时,就表示没有传输在进行。
                       每次计数器发生变化时,更可以通过调用curl_multi_info_read()来获得特定传输返回的信息。  

    Connection resue

              -------------按照 Monk 的理解-----------------------
              就是当一个事件完成时,libcurl不会释放事件所占有的资源,而是留给随后的事件使用,这就可以避免重新创建新的句柄。这样性能就会得到提升。                  

    Callbacks
        Wirte data:
            ---prototype
            size_t write_callback(char* ptr, size_t size, size_t nmemb, void* userdata);
            curl_easy_setopt(handle, CURLOPT_WRITEDATA, custom_pointer/*pointes to private data*/);
            curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, write_cb);
                ptr : 指向需要传输的数据
                size 和 nmemb 的乘积为数据的长度
                通常最大的传输长度在curl.h头文件中定义为16KB。如果设置了CURLOPT_HEADRE,这数据头信息也会被传给回调函数,最大长度为CURL_MAX_HTTP_HEADER(100KB)      
     
          Read data:
              ---prototype
              size_t read_callback(char* buffer, size_t size, size_t nitems, void* stream);
              curl_easy_setopt(handle, CURLOPT_READDATA, custom_pointer/*points to private data*/);
              curl_easy_setopt(handle, CURLOPT_READFUNCTION, read_cb);
                     buffer大小为 size 和 nitems 的乘积

          Progress callback
              -------------按照Monk的理解----------------
               就是在事件执行过程中,通过回调获得事件的状态信息。

              ----prototype
              int xfer_callback(void* clientp,  /* points to the private data */
                                curl_off_t dltotal, /* the number of bytes libcurl expects to download in this transfer */
                                curl_off_t dlnow, /* the number of bytes downloaded so far */
                                curl_off_t ultotal,/* the total number of bytes libcurl expects to upload in this transfer */
                                curl_off_t ulnow); /* the number of bytes uploaded so far */
              curl_easy_setopt(handle, CURLOPT_XFERINFOFUNCTION, xfer_callback);
              curl_easy_setopt(handle, CURLOPT_XFERINFODATA, custom_pointer);

           Header data
               ---prototype
               size_t header_callback(char* ptr, size_t size, size_t nmemb, void* userdata);
               curl_easy_setopt(handle, CURLOPT_HEADERFUNCTION, header_cb);
               curl_easy_setopt(handle, CURLOPT_HEADERDATA, custon_pointer);

           Debug data
              ---prototype
              int debug_callback(CURL* handle,
                                 curl_infotype type,
                                 char* data,
                                 size_t size,
                                 void* userdata);
              curl_easy_setopt(handle, CURLOPT_DEBUGFUNCTION, debug_cb);
              curl_easy_setopt(handle,CURLOPT_DEBUGDATA,custom_pointer);
           
           Sockopt
              ---prototype
              int sockopt_callback(void* clientp,
                       curl_socket_t curlfd,
                                   curlsocktype purpose);
              curl_easy_setopt(handle, CURLOPT_SOCKOPTFUNCTION, sockopt_cb);
              curl_easy_setopt(handle,CURLOPT_SOCKOPTDATA, custom_pointer);
    Cleanup
         Multi API
             每用 multi API 完成一次简单传输,你应该用curl_multi_info_read()来确定是哪个事件已经完成,并从curl_multi_remove_handle()从事件集中删除。
             当从事件集中把最后一个简单事件都删除后,应该调用curl_multi_cleanup(multi_handle) 来释放资源。
     
         Easy handle
             当简单事件完成时,如果不希望其他的事件再使用这个事件所占的资源,则可以调用curl_easy_cleanup(easy_handle)来释放资源。

    Sample

    /********* Sample code generated by the curl command-line tool **********
     * All curl_easy_setopt() options are documented at:
     * https://curl.haxx.se/libcurl/c/curl_easy_setopt.html
     ************************************************************************/
    #include <curl/curl.h>

    int main(int argc, char *argv[])
    {
      CURLcode ret;
      CURL *hnd;

      hnd = curl_easy_init();
      curl_easy_setopt(hnd, CURLOPT_URL, "http://example.com");
      curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
      curl_easy_setopt(hnd, CURLOPT_USERAGENT, "curl/7.45.0");
      curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
      curl_easy_setopt(hnd, CURLOPT_SSH_KNOWNHOSTS, "/home/daniel/.ssh/known_hosts");
      curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);

      /* Here is a list of options the curl code used that cannot get generated
         as source easily. You may select to either not use them or implement
         them yourself.

      CURLOPT_WRITEDATA set to a objectpointer
      CURLOPT_WRITEFUNCTION set to a functionpointer
      CURLOPT_READDATA set to a objectpointer
      CURLOPT_READFUNCTION set to a functionpointer
      CURLOPT_SEEKDATA set to a objectpointer
      CURLOPT_SEEKFUNCTION set to a functionpointer
      CURLOPT_ERRORBUFFER set to a objectpointer
      CURLOPT_STDERR set to a objectpointer
      CURLOPT_HEADERFUNCTION set to a functionpointer
      CURLOPT_HEADERDATA set to a objectpointer

      */

      ret = curl_easy_perform(hnd);

      curl_easy_cleanup(hnd);
      hnd = NULL;

      return (int)ret;
    }
    /**** End of sample code ****/        

    CURLcode return code
          method 1:
             const char* str = curl_easy_strerror(error);
             printf("libcurl said %s\n", str);
          method 2:
             curl error[CURL_ERROR_SIZE];
             CURLcode ret = curl_easy_setopt(handle, CURLOPT_ERRORBUFFER, error);

         我的神 .......

         才翻译这么一点点!!!

         有啥错误,还望给个看客姥爷们批评指正,第一次翻译这东西,难免有不周之处,哎, 又误了多少子弟!

    -------- Created at : 2016-11-23 18:00

    -------- Author   : Monk

    -------- Modified  : 2016-11-24 17:00

    展开全文
  • 我使用libcurl实现网络连接,当我在连续发送网络请求一段时间之后,curl_multi_init接口会返回空就像这样子 CURLM *pMulitHandle=curl_multi_init(); pMulitHandle为空,请问这是什么原因?
  • libcurl库中curl_getinfo()返回值详解

    千次阅读 2008-12-12 21:00:18
    [code="java"]array 'url' => 'http://tc-apptest-zhangmen01.tc.google.com:2580/index.php?sex=male' (length=65) 'content_type' => 'text/html' (length=9) 'http_code' =>... 16...
    array
    'url' => 'http://tc-apptest-zhangmen01.tc.google.com:2580/index.php?sex=male' (length=65)
    'content_type' => 'text/html' (length=9)
    'http_code' => 302
    'header_size' => 169
    'request_size' => 256
    'filetime' => -1
    'ssl_verify_result' => 0
    'redirect_count' => 0
    'total_time' => 0.005
    'namelookup_time' => 0.001
    'connect_time' => 0.003
    'pretransfer_time' => 0.003
    'size_upload' => 0
    'size_download' => 211
    'speed_download' => 42200
    'speed_upload' => 0
    'download_content_length' => 211
    'upload_content_length' => 0
    'starttransfer_time' => 0.005
    'redirect_time' => 0




    以上是我程序中一条curl_getinfo()语句得出来的信息:

    下面分析各个元素表示的信息:
    url是这次curl连接的地址,http_code是302,表示这个url地址表示的文件中存在重定向,而redirect_count=0和redirect_time=0表示这次curl连接没有跟踪重定向,这是curl默认的参数设置,如果设置一下:
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);

    那么curl_getinfo()的信息就会变成这样:

    array
    'url' => 'http://tc-apptest-zhangmen01.tc.google.com:2580/phpinfo.php' (length=58)
    'content_type' => 'text/html' (length=9)
    'http_code' => 200
    'header_size' => 319
    'request_size' => 458
    'filetime' => -1
    'ssl_verify_result' => 0
    'redirect_count' => 1
    'total_time' => 0.018
    'namelookup_time' => 0
    'connect_time' => 0
    'pretransfer_time' => 0
    'size_upload' => 0
    'size_download' => 39333
    'speed_download' => 2185166
    'speed_upload' => 0
    'download_content_length' => 211
    'upload_content_length' => 0
    'starttransfer_time' => 0.002
    'redirect_time' => 0.008


    上面的url是从上一个url重定向到的新的url,这个url没有在重定向,因此它的http_code是200,而redirect_count和redirect_time都不再是0.

    [color=red]另外connect_time是建立连接的时间,在我测试了好几次之后发现connect_time总是等于pretransfer_time(这个时间是从一开始到开始传输数据的时间),但是不能就这么判定两者永远相等。那么两者时间会差在哪里呢?因为建立连接后就开始传输数据,因此我估计两者在截至的时间上相同,如果不同的话,估计是在计算时间的开始点上。pretransfer_time是从开始到传输数据,起点是在最开始,而connect_time的定义是连接花费时间,起点是开始连接。想了很长时间也是不明白,请求明白人指点。[/color]

    nameloopup time是从开始到名字解析花费的时间。

    [color=red]size_upload为什么总是0呢?即使我使用了POST方法传输了数据也还是0,什么情况下才不是0呢?[/color]

    size_download是页面的content-lenght值,而speed_download是size_download/total_time的出来的。
    展开全文
  • libcurl说明文档

    2014-09-18 20:01:43
    libcurl中几个重要函数的,返回值说明文档
  • libcurl阻塞

    2018-08-22 15:26:09
    libcurl使用时疑难问题: 在使用libcurl时, jwisp发现, curl_easy_perform是阻塞的方式进行下载的, curl_easy_perform执行后,程序会在这里阻塞等待下载结束(成功结束或者失败结束).此时若正常下载一段时间后,进行...
  • LibCurl编程

    2014-10-22 17:42:29
    一:LibCurl编程流程 1.调用curl_global_init()初始化libcurl 2.调用 curl_easy_init()函数得到 easy interface型指针 3.调用curl_easy_setopt设置传输选项 4.根据curl_easy_setopt设置的传输选项,实现回调函数...
  • LibCurl 简介

    2018-10-29 09:35:29
    1、LibCurl简介 LibCurl是免费的客户端URL传输库,支持FTP,FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE ,LDAP等协议,其主页是http://curl.haxx.se/。Libcurl具备线程安全、IpV6兼容、易于使用的特点...
  • libcurl获取FTP目录信息

    千次阅读 2018-02-26 13:58:57
    libcurl获取FTP目录信息 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:12951803 FileZilla版本:FileZilla_Server-0_9_60_2 libcurl版本:curl-7.56.0 需求: ...
  • 在做一个项目时使用了开源的网络库libcurl,在过程中发现一个轮询的功能会出现不运行情况,开始是以为是线程原因,后面发现由于在电脑睡眠时线程会卡在res = curl_easy_perform(pCurl);一直不接到返回值,就算后面...
  • libcurl使用简介

    千次阅读 2017-03-06 11:24:58
    欢迎使用Markdown编辑器写博客一. libcurl是一个为网络客户端提供数据传输功能的函数库,支持HTTP,HTTPS,... 基于libcurl的程序里主要用回调函数形式完全成任务,用户在启动传输前先设好各类参数和回调函数,当条件
  • libcurl实现解析(3) - libcurl对select的使用
  • libcurl学习

    2014-07-14 20:20:44
    一、LibCurl基本编程框架 libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传...
  • libcurl编程

    千次阅读 2011-08-10 14:39:53
    LibCurl编程流程在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能。...
  • libcurl库 openssl

    2021-02-05 15:32:17
    libcurllibcurl库介绍libcurl库的安装libcurl库的应用寻找库文件 libcurl库介绍 libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书...
  • libcurl的使用

    千次阅读 2016-11-10 15:05:01
    简介libcurl是一个客户端URL传输库,支持很多协议...此处使用的语言为C++,虽然libcurl有C++的binding,但是那样就得看两份文档了,太麻烦,况且官方文档提到了在C++下使用时,唯一需要注意的是回调函数不能为非静
  • libCurl使用指南

    千次阅读 2012-12-13 16:32:23
    最近的项目中由于要在C++代码中调用PHP的URL,所以不得不借助libcurl这个库,...快速链接--libcurl的使用总结(一) 一.下载安装  1.到http://curl.haxx.se/download.html上下载最新版本,由于公司的机器安装rpm
  • libcurl

    千次阅读 2012-08-31 20:31:27
    libcurl使用心得 概述 Libcurl为一个免费开源的,客户端url传输库,支持 FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和LDAP,跨平 台,支持Windows,Unix,Linux等,线程安全,支持
  • libcurl简介

    2013-11-27 13:27:28
    只要返回值是CURLM_CALL_MULTI_PERFORM,需要一直调用curl_multi_perform接口。   总结 Easy接口的编程模型 Easy接口都是单线程模型,调用简单,适用于单个url请求的场景。   Multi接口的...
  • libcurl 使用方法简介

    2020-05-06 15:28:55
    最近项目中需要使用http实现文件的上传功能,使用到了libcurl,转载了一篇博客记录下,便于后续的查看。 简介 libcurl是一个跨平台的开源网络协议库,支持http, https, rtsp等多种协议 。libcurl同样支持HTTPS...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,415
精华内容 566
关键字:

libcurl返回值