您的位置:首页 > 其它

使用libcurl实现put访问服务器

2013-09-11 21:00 99 查看
Libcurl为一个免费开源的,客户端curl传输库,FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和LDAP,跨平台,支持Windows,Unix,Linux等,线程安全,支持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功能。

代码如下:



#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>

#include <stdarg.h> 
#include <string.h> 
#include <errno.h> 
#include <check_error.h> 

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

//重写把数据读入上传数据流函数 
size_t read_file(void* buff, size_t size, size_t nmemb, void* userp) 
{ 
    size_t sizes = fread(buff, size, nmemb, (FILE *)userp); 
    return sizes; 
} 
  
int main(int argc,char **argv)
{ 
    CURLcode res; //easy_handle定义的一些错误码 
    const char url[2096];
   //初始化libcurl 
  
     if(argc!=3)
    {
        printf("please input url and filename");
        exit(-1);
    }
     res = curl_global_init(CURL_GLOBAL_ALL); 
    if (res != CURLE_OK) 
    { 
        printf("init libcurl failed.\n" ); 
       return -1; 
    } 
   
    
    //获取要上传的文件指针 
   FILE* r_file = fopen(argv[2], "rb"); 
    if (0 == r_file) 
    { 
       printf( "the file %s isnot exit\n",argv[2]); 
      return -1; 
    } 
  
    CURL* easy_handle; 
  
    easy_handle = curl_easy_init(); 
    if (0 == easy_handle) 
   { 
       printf( "get a easy_handle handle fail!"); 
       fclose(r_file); 
       curl_global_cleanup(); 
       curl_easy_cleanup(easy_handle); 
       return -1; 
   } 
 
    // 获取文件大小 
   fseek(r_file, 0, 2); 
   int file_size = ftell(r_file); 
   rewind(r_file); 
  
   curl_easy_setopt(easy_handle, CURLOPT_URL, argv[1]); //获取URL地址 
   curl_easy_setopt(easy_handle, CURLOPT_UPLOAD, 1); //告诉easy_handle是做上传操作 
   curl_easy_setopt(easy_handle, CURLOPT_READFUNCTION, &read_file); //调用重写的读文件流函数 
   curl_easy_setopt(easy_handle, CURLOPT_READDATA, r_file); //往read_file()函数中传入用户自定义的数据类型 
   curl_easy_setopt(easy_handle, CURLOPT_INFILE, r_file); //定位作为上传的输入文件 
   curl_easy_setopt(easy_handle, CURLOPT_VERBOSE, 1); //打印出具体http协议字段
   //curl_easy_setopt(easy_handle, CURLOPT_HEADER, 1);
   curl_easy_setopt(easy_handle, CURLOPT_INFILESIZE, file_size); //上传的字节数 

    //执行设置好的操作 
    res = curl_easy_perform(easy_handle); 
 
   //获取HTTP错误码 
   int HTTP_flag = 0; 
    curl_easy_getinfo(easy_handle, CURLINFO_RESPONSE_CODE , &HTTP_flag); 
 
  //一般清理动作 
   fclose(r_file); 
   curl_global_cleanup(); 
   curl_easy_cleanup(easy_handle); 
   
   printf("url :%s localfile: %s\n",argv[1],argv[2]);
   printf("HTTP_flag is %d\n",HTTP_flag);

// printf( "操作本地文件: file_name url:\n"); 
   //检测HTTP错误码和执行操作结果 
   if (CURLE_OK != res) 
   { 
        printf("failure\n"); 
       return -1; 
   } 
    else 
    { 
      printf("success\n"); 
      return 0; 
    } 

 }


转载自:http://blog.chinaunix.net/uid-27766566-id-3474454.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: