libcurl ftp下载实例

转载 2013年12月04日 17:25:42

从ftp站点下载文件的例子.

view plaincopy to clipboardprint?
#include <stdio.h>;  
#include < curl/curl.h>;  
#include <curl/types.h>;  
#include < curl/easy.h>;  

struct FtpFile    //定义一个结构为了传递给my_fwrite函数.可用curl_easy_setopt的CURLOPT_WRITEDATA选项传递  
{   
        char *filename;  
        FILE *stream;  
};  

int  my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)  
{   
        struct FtpFile *out=(struct FtpFile *)stream; // stream指针其实就是  指向struct FtpFile ftpfile的  
        if(out && !out->stream)   
        {  
                out->stream=fopen(out->filename,  "wb"); //没有这个流的话就创建一个 名字是out->filename.  
                 if(!out->stream)  
                return -1;  
        }   
        return fwrite(buffer, size, nmemb, out->stream);  
}   

int main(int argc, char *argv[])  
{  
        CURL *curl;   
        CURLcode res;  
        struct FtpFile ftpfile={argv[2],NULL};  //初始化一个FtpFile结构   
        curl_global_init(CURL_GLOBAL_DEFAULT);   

        curl = curl_easy_init();  
        if(curl)  
         {  
                curl_easy_setopt(curl, CURLOPT_URL,argv[1]);   

                curl_easy_setopt(curl,  CURLOPT_USERPWD,"user:passwd");
                curl_easy_setopt(curl,  CURLOPT_WRITEFUNCTION, my_fwrite);  
                curl_easy_setopt(curl,  CURLOPT_WRITEDATA, &ftpfile); //给相关函数的第四个参数 传递一个结构体的指针  
                 curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE); //CURLOPT_VERBOSE 这个选项很常用  用来在屏幕上显示对服务器相关操作返回的信息  

                res = curl_easy_perform(curl);   
                curl_easy_cleanup(curl);  

                 if(CURLE_OK != res)  
                        fprintf(stderr, "curl told us  %d/n", res);  
        }  
        if(ftpfile.stream)  
         fclose(ftpfile.stream);  
        curl_global_cleanup();  

         return 0;  

 /*****************************************************************************

  FTP上传下载功能

  */

  #include <stdlib.h>

  #include <stdio.h>

  #include <curl/curl.h>

  #include <sys/stat.h>

  /* parse headers for Content-Length */

  size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream) {

  int r;

  long len = 0;

  /* _snscanf() is Win32 specific */

  //r = _snscanf(ptr, size * nmemb, "Content-Length: %ld/n", &len);

  r = sscanf(ptr, "Content-Length: %ld/n", &len);

  if (r) /* Microsoft: we don't read the specs */

  *((long *) stream) = len;

  return size * nmemb;

  }

  /* discard downloaded data */

  size_t discardfunc(void *ptr, size_t size, size_t nmemb, void *stream) {

  return size * nmemb;

  }

  //write data to upload

  size_t writefunc(void *ptr, size_t size, size_t nmemb, void *stream)

  {

  return fwrite(ptr, size, nmemb, stream);

  }

  /* read data to upload */

  size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream)

  {

  FILE *f = stream;

  size_t n;

  if (ferror(f))

  return CURL_READFUNC_ABORT;

  n = fread(ptr, size, nmemb, f) * size;

  return n;

  }

  int upload(CURL *curlhandle, const char * remotepath, const char * localpath,

  long timeout, long tries)

  {

  FILE *f;

  long uploaded_len = 0;

  CURLcode r = CURLE_GOT_NOTHING;

  int c;

  f = fopen(localpath, "rb");

  if (f == NULL) {

  perror(NULL);

  return 0;

  }

  curl_easy_setopt(curlhandle, CURLOPT_UPLOAD, 1L);

  curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);

  if (timeout)

  curl_easy_setopt(curlhandle, CURLOPT_FTP_RESPONSE_TIMEOUT, timeout);

  curl_easy_setopt(curlhandle, CURLOPT_HEADERFUNCTION, getcontentlengthfunc);

  curl_easy_setopt(curlhandle, CURLOPT_HEADERDATA, &uploaded_len);

  curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, discardfunc);

  curl_easy_setopt(curlhandle, CURLOPT_READFUNCTION, readfunc);

  curl_easy_setopt(curlhandle, CURLOPT_READDATA, f);

  curl_easy_setopt(curlhandle, CURLOPT_FTPPORT, "-"); /* disable passive mode */

  curl_easy_setopt(curlhandle, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);

  curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L);

  for (c = 0; (r != CURLE_OK) && (c < tries); c++) {

  /* are we resuming? */

  if (c) { /* yes */

  /* determine the length of the file already written */

  /*

  * With NOBODY and NOHEADER, libcurl will issue a SIZE

  * command, but the only way to retrieve the result is

  * to parse the returned Content-Length header. Thus,

  * getcontentlengthfunc(). We need discardfunc() above

  * because HEADER will dump the headers to stdout

  * without it.

  */

  curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 1L);

  curl_easy_setopt(curlhandle, CURLOPT_HEADER, 1L);

  r = curl_easy_perform(curlhandle);

  if (r != CURLE_OK)

  continue;

  curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 0L);

  curl_easy_setopt(curlhandle, CURLOPT_HEADER, 0L);

  fseek(f, uploaded_len, SEEK_SET);

  curl_easy_setopt(curlhandle, CURLOPT_APPEND, 1L);

  }

  else { /* no */

  curl_easy_setopt(curlhandle, CURLOPT_APPEND, 0L);

  }

  r = curl_easy_perform(curlhandle);

  }

  fclose(f);

  if (r == CURLE_OK)

  return 1;

  else {

  fprintf(stderr, "%s/n", curl_easy_strerror(r));

  return 0;

  }

  }

  // 下载

  int download(CURL *curlhandle, const char * remotepath, const char * localpath,

  long timeout, long tries)

  {

  FILE *f;

  curl_off_t local_file_len = -1 ;

  long filesize =0 ;

  CURLcode r = CURLE_GOT_NOTHING;

  struct stat file_info;

  int use_resume = 0;

  //获取本地文件大小信息

  if(stat(localpath, &file_info) == 0)

  {

  local_file_len = file_info.st_size;

use_resume = 1;

  }

  //追加方式打开文件,实现断点续传

  f = fopen(localpath, "ab+");

  if (f == NULL) {

  perror(NULL);

  return 0;

  }

  curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);

  //连接超时设置

  curl_easy_setopt(curlhandle, CURLOPT_CONNECTTIMEOUT, timeout);

  //设置头处理函数

  curl_easy_setopt(curlhandle, CURLOPT_HEADERFUNCTION, getcontentlengthfunc);

  curl_easy_setopt(curlhandle, CURLOPT_HEADERDATA, &filesize);

  // 设置断点续传

  curl_easy_setopt(curlhandle, CURLOPT_RESUME_FROM_LARGE, use_resume?local_file_len:0);

  curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, writefunc);

  curl_easy_setopt(curlhandle, CURLOPT_WRITEDATA, f);

  curl_easy_setopt(curlhandle, CURLOPT_NOPROGRESS, 1L);

  curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L);

  r = curl_easy_perform(curlhandle);

  fclose(f);

  if (r == CURLE_OK)

  return 1;

  else {

  fprintf(stderr, "%s/n", curl_easy_strerror(r));

  return 0;

  }

  }

  int main(int c, char **argv) {

  CURL *curlhandle = NULL;

  CURL *curldwn = NULL;

  curl_global_init(CURL_GLOBAL_ALL);

  curlhandle = curl_easy_init();

  curldwn = curl_easy_init();

  upload(curlhandle, "ftp://ffcs:ffcs@135.125.97.42/ipmsg.log", "C://ipmsg.log", 1, 3);

  download(curldwn, "ftp://ffcs:ffcs@135.125.97.42/2009.txt", "C://id.log", 1, 3);

  curl_easy_cleanup(curlhandle);

  curl_easy_cleanup(curldwn);

  curl_global_cleanup();

  return 0;

  }

 

 

 

 

libcurl简单接口的使用(FTP)

教材:linux环境C程序设计 徐诚 高莹婷    网络资料 一. 文件传输协议(File Transfer Protocol)是进行文件传输的一套标准协议,属于TCP/IP协议的一部分。FTP服...
  • sever2012
  • sever2012
  • 2011年12月16日 11:06
  • 9961

libcurl实现断点续传

实现断点续传主要就是通过curl_easy_setopt设置好CURLOPT_RESUME_FROM_LARGE属性完成 首先获取已下载文件大小,然后设置CURLOPT_RESUME_FROM_LAR...
  • ixiaochouyu
  • ixiaochouyu
  • 2015年08月05日 18:41
  • 2974

(四)使用Libcurl下载文件,解决无信号中断,下载中掉电恢复后断点续传问题的源代码

源代码附上:   //全局变量 bool resumeDownload = false; //是否需要下载的标记位 long downloadFileLenth = 0; //需要下载的...
  • javarat
  • javarat
  • 2012年09月20日 22:57
  • 6010

CURL断点续传(FTP/HTTP)

include include pragma comment(lib,”libcurl_a_debug.lib”)size_t getcontentlengthfunc(void* ptr,size_...
  • Gof_503
  • Gof_503
  • 2017年03月31日 10:20
  • 273

(二)使用libcurl实现获取目标文件大小, 下载进度显示, 断点续传等功能

本节jwisp为大家举例说明如果使用上节介绍的函数和参数,在使用libcurl的过程中,如何获取下载目标文件的大小 , 下载进度条,断点续传等,这些基本的函数,将为jwisp在最后处理下载过程异常...
  • javarat
  • javarat
  • 2012年09月20日 22:53
  • 9937

Libcurl实现断点续传

http://www.cnblogs.com/chang290/archive/2012/08/12/2634858.html 一、LIbcurl简单介绍     其实关于Li...
  • anypkv
  • anypkv
  • 2013年11月19日 14:14
  • 1090

MFC中通过CURL 下载,断点续传

http://www.360doc.com/content/13/0910/11/593831_313466246.shtml 一、LIbcurl简单介绍     其实关于Liccurl...
  • anypkv
  • anypkv
  • 2013年11月19日 14:16
  • 1196

C++ 关于断点续传的方法,使用CURL技术

STEP1 CURL *curlhandle = NULL; // curl_global_init(CURL_GLOBAL_ALL); curlhandle = curl_easy_init...
  • u013317006
  • u013317006
  • 2014年04月11日 11:31
  • 1228

使用curl 命令上传下载FTP

http://blog.163.com/hehaifeng1984@126/blog/static/690011362013112255444299/ 1、列出ftp服务器上的目录列表: cur...
  • adream307
  • adream307
  • 2015年07月17日 21:24
  • 4145

libcurl 库的ftp上传和下载代码

昨天考虑好了IM传送图片的方式,用的是FTP做缓存来传递图片,以减少聊天服务器的压力,用的是libcurl库,自己下载了一个Server-U 服务器,下面是测试程序,上传和下载都跑通了,剩下的就是在程...
  • zengraoli
  • zengraoli
  • 2013年09月10日 09:46
  • 16968
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:libcurl ftp下载实例
举报原因:
原因补充:

(最多只允许输入30个字)