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;
    }

  • 相关阅读:
    利用dockerfile定制镜像
    发布Docker 镜像到dockerhub
    Docker 停止容器
    133. Clone Graph
    132. Palindrome Partitioning II
    131. Palindrome Partitioning
    130. Surrounded Regions
    129. Sum Root to Leaf Numbers
    128. Longest Consecutive Sequence
    127. Word Ladder
  • 原文地址:https://www.cnblogs.com/xhmf/p/3891464.html
Copyright © 2011-2022 走看看