Chinaunix首页 | 论坛 | 博客
  • 博客访问: 241263
  • 博文数量: 35
  • 博客积分: 791
  • 博客等级: 军士长
  • 技术积分: 510
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-05 16:56
文章分类
文章存档

2013年(7)

2012年(28)

我的朋友

分类: C/C++

2013-01-14 09:41:12

      
   Libcurl为一个免费开源的,客户端curl传输库,FTPFTPSTFTPHTTPHTTPSGOPHERTELNETDICTFILELDAP,跨平台,支持WindowsUnixLinux等,线程安全,支持Ipv6。并且易于使用。
  关于libcurl具体用法:
1、初始化应用程序在使用libcurl之前,必须先初始化libcurl。libcurl只需初始化一次。可以使用以下语句进行初始化:
curl_global_init();
2、CURL *curl_easy_init() 此函数需要最先被调用,返回CRUL easy句柄;后续其他函数调用都要用到这个句柄。如果没有调用curl_global_init(),该函数自动调用,但是考虑到线程安全的问题,最好自己调用curl_global_init()。
3、参数和选项设置都是通过以下函数完成的,它告诉libcurl怎样去进行传输CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter)
参数handle即为curl_easy_init()返回的句柄,后 面根据option的类型,设置相应的parameter值,该函数每次调用只能设置一个选项
4、curl_easy_perform 函数说明(error 状 态码).该函数完成curl_easy_setopt指定的所有选项,本节重点介绍curl_easy_perform的返回值。返回0意味一 切ok,非0代表错误发生。
通过以上的了解,实现文件的上传功能,即http的put功能。
代码如下:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <fcntl.h>
  4. #include <sys/stat.h>
  5. #include <unistd.h>
  6. #include <curl/curl.h>
  7. #include <curl/types.h>
  8. #include <curl/easy.h>



  9. #include <stdarg.h>
  10. #include <string.h>
  11. #include <errno.h>
  12. #include <check_error.h>


  13. FILE *fp; //定义FILE类型指针

  14. //重写把数据读入上传数据流函数
  15. size_t read_file(void* buff, size_t size, size_t nmemb, void* userp)
  16. {
  17.     size_t sizes = fread(buff, size, nmemb, (FILE *)userp);
  18.     return sizes;
  19. }
  20.   
  21. int main(int argc,char **argv)
  22. {
  23.     CURLcode res; //easy_handle定义的一些错误码
  24.     const char url[2096];
  25.    //初始化libcurl
  26.   
  27.      if(argc!=3)
  28.     {
  29.         printf("please input url and filename");
  30.         exit(-1);
  31.     }
  32.      res = curl_global_init(CURL_GLOBAL_ALL);
  33.     if (res != CURLE_OK)
  34.     {
  35.         printf("init libcurl failed.\n" );
  36.        return -1;
  37.     }
  38.    
  39.     
  40.     //获取要上传的文件指针
  41.    FILE* r_file = fopen(argv[2], "rb");
  42.     if (0 == r_file)
  43.     {
  44.        printf( "the file %s isnot exit\n",argv[2]);
  45.       return -1;
  46.     }
  47.   
  48.     CURL* easy_handle;
  49.   
  50.     easy_handle = curl_easy_init();
  51.     if (0 == easy_handle)
  52.    {
  53.        printf( "get a easy_handle handle fail!");
  54.        fclose(r_file);
  55.        curl_global_cleanup();
  56.        curl_easy_cleanup(easy_handle);
  57.        return -1;
  58.    }
  59.  
  60.     // 获取文件大小
  61.    fseek(r_file, 0, 2);
  62.    int file_size = ftell(r_file);
  63.    rewind(r_file);
  64.   
  65.    curl_easy_setopt(easy_handle, CURLOPT_URL, argv[1]); //获取URL地址
  66.    curl_easy_setopt(easy_handle, CURLOPT_UPLOAD, 1); //告诉easy_handle是做上传操作
  67.    curl_easy_setopt(easy_handle, CURLOPT_READFUNCTION, &read_file); //调用重写的读文件流函数
  68.    curl_easy_setopt(easy_handle, CURLOPT_READDATA, r_file); //往read_file()函数中传入用户自定义的数据类型
  69.    curl_easy_setopt(easy_handle, CURLOPT_INFILE, r_file); //定位作为上传的输入文件
  70.    curl_easy_setopt(easy_handle, CURLOPT_VERBOSE, 1); //打印出具体http协议字段
  71.    //curl_easy_setopt(easy_handle, CURLOPT_HEADER, 1);
  72.    curl_easy_setopt(easy_handle, CURLOPT_INFILESIZE, file_size); //上传的字节数

  73.     //执行设置好的操作
  74.     res = curl_easy_perform(easy_handle);
  75.  
  76.    //获取HTTP错误码
  77.    int HTTP_flag = 0;
  78.     curl_easy_getinfo(easy_handle, CURLINFO_RESPONSE_CODE , &HTTP_flag);
  79.  
  80.   //一般清理动作
  81.    fclose(r_file);
  82.    curl_global_cleanup();
  83.    curl_easy_cleanup(easy_handle);
  84.    
  85.    printf("url :%s localfile: %s\n",argv[1],argv[2]);
  86.    printf("HTTP_flag is %d\n",HTTP_flag);

  87. // printf( "操作本地文件: file_name url:\n";
  88.    //检测HTTP错误码和执行操作结果
  89.    if (CURLE_OK != res)
  90.    {
  91.         printf("failure\n");
  92.        return -1;
  93.    }
  94.     else
  95.     {
  96.       printf("success\n");
  97.       return 0;
  98.     }

  99.  }


   
   
阅读(9345) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~