zoukankan      html  css  js  c++  java
  • Curl学习

    libcurl有两个接口

    easy接口 同步、高效 前缀curl_easy。

    multi接口 异步  前缀curl_multi。multi使用单线程

    easy使用范例

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>

    #include <curl/curl.h>

    //回调

    static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
    {
      int written = fwrite(ptr, size, nmemb, (FILE *)stream);
      return written;
    }

    int main(void)
    {
      CURL *curl_handle;
      static const char *headerfilename = "head.out";
      FILE *headerfile;
      static const char *bodyfilename = "body.out";
      FILE *bodyfile;

      curl_global_init(CURL_GLOBAL_ALL);

      /* init the curl session */
      curl_handle = curl_easy_init();

      /* set URL to get */
      curl_easy_setopt(curl_handle, CURLOPT_URL, "http://example.com");

      /* no progress meter please */
      curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);

      /* send all data to this function  */
      curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);

      /* open the files */
      headerfile = fopen(headerfilename,"wb");
      if (headerfile == NULL) {
        curl_easy_cleanup(curl_handle);
        return -1;
      }
      bodyfile = fopen(bodyfilename,"wb");
      if (bodyfile == NULL) {
        curl_easy_cleanup(curl_handle);
        return -1;
      }

      /* we want the headers be written to this file handle */
      curl_easy_setopt(curl_handle,   CURLOPT_WRITEHEADER, headerfile);

      /* we want the body be written to this file handle instead of stdout */
      curl_easy_setopt(curl_handle,   CURLOPT_WRITEDATA, bodyfile);

      /* get it! */
      curl_easy_perform(curl_handle);

      /* close the header file */
      fclose(headerfile);

      /* close the body file */
      fclose(bodyfile);

      /* cleanup curl stuff */
      curl_easy_cleanup(curl_handle);

      return 0;
    }

    multi使用范例

    #include <stdio.h>
    #include <string.h>
    #include <sys/time.h>

    #include <curl/curl.h>

    int main(void)
    {
      CURL *curl;

      CURLM *multi_handle;
      int still_running;

      struct curl_httppost *formpost=NULL;
      struct curl_httppost *lastptr=NULL;
      struct curl_slist *headerlist=NULL;
      static const char buf[] = "Expect:";

      /* Fill in the file upload field. This makes libcurl load data from
         the given file name when curl_easy_perform() is called. */
      curl_formadd(&formpost,
                   &lastptr,
                   CURLFORM_COPYNAME, "sendfile",
                   CURLFORM_FILE, "postit2.c",
                   CURLFORM_END);

      /* Fill in the filename field */
      curl_formadd(&formpost,
                   &lastptr,
                   CURLFORM_COPYNAME, "filename",
                   CURLFORM_COPYCONTENTS, "postit2.c",
                   CURLFORM_END);

      /* Fill in the submit field too, even if this is rarely needed */
      curl_formadd(&formpost,
                   &lastptr,
                   CURLFORM_COPYNAME, "submit",
                   CURLFORM_COPYCONTENTS, "send",
                   CURLFORM_END);

      curl = curl_easy_init();
      multi_handle = curl_multi_init();

      /* initalize custom header list (stating that Expect: 100-continue is not
         wanted */
      headerlist = curl_slist_append(headerlist, buf);
      if(curl && multi_handle) {

        /* what URL that receives this POST */
        curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/upload.cgi");
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
        curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);

        curl_multi_add_handle(multi_handle, curl);

        curl_multi_perform(multi_handle, &still_running);

        do {
          struct timeval timeout;
          int rc; /* select() return code */

          fd_set fdread;
          fd_set fdwrite;
          fd_set fdexcep;
          int maxfd = -1;

          long curl_timeo = -1;

          FD_ZERO(&fdread);
          FD_ZERO(&fdwrite);
          FD_ZERO(&fdexcep);

          /* set a suitable timeout to play around with */
          timeout.tv_sec = 1;
          timeout.tv_usec = 0;

          curl_multi_timeout(multi_handle, &curl_timeo);
          if(curl_timeo >= 0) {
            timeout.tv_sec = curl_timeo / 1000;
            if(timeout.tv_sec > 1)
              timeout.tv_sec = 1;
            else
              timeout.tv_usec = (curl_timeo % 1000) * 1000;
          }

          /* get file descriptors from the transfers */
          curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);

          /* In a real-world program you OF COURSE check the return code of the
             function calls.  On success, the value of maxfd is guaranteed to be
             greater or equal than -1.  We call select(maxfd + 1, ...), specially in
             case of (maxfd == -1), we call select(0, ...), which is basically equal
             to sleep. */

          rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);

          switch(rc) {
          case -1:
            /* select error */
            break;
          case 0:
          default:
            /* timeout or readable/writable sockets */
            printf("perform! ");
            curl_multi_perform(multi_handle, &still_running);
            printf("running: %d! ", still_running);
            break;
          }
        } while(still_running);

        curl_multi_cleanup(multi_handle);

        /* always cleanup */
        curl_easy_cleanup(curl);

        /* then cleanup the formpost chain */
        curl_formfree(formpost);

        /* free slist */
        curl_slist_free_all (headerlist);
      }
      return 0;
    }

  • 相关阅读:
    Cheapest Palindrome(区间DP)
    Dividing coins (01背包)
    Cow Exhibition (01背包)
    Bone Collector II(01背包kth)
    饭卡(01背包)
    Charm Bracelet(01背包)
    Investment(完全背包)
    Bone Collector(01背包)
    Robberies(01背包)
    ACboy needs your help(分组背包)
  • 原文地址:https://www.cnblogs.com/xhmf/p/3891464.html
Copyright © 2011-2022 走看看