转自:http://blog.csdn.net/sever2012/article/details/7076248

教材:linux环境C程序设计 徐诚 高莹婷

   网络资料

一. 文件传输协议(File Transfer Protocol)是进行文件传输的一套标准协议,属于TCP/IP协议的一部分。FTP服务一般在20和21两个端口。其中20用于数据连接,21用于控制连接。FTP有两种使用模式:主动模式和被动模式。主动模式安全性高,要求服务端和客户端各打开一个端口并监听以建立连接,但客户端的防火墙可能阻碍主动模式,因此创建了被动模式。被动模式由客户端向服务端发出需要监听的端口,由服务端在该端口监听等待连接。

二. libcurl是一个为网络客户端提供数据传输功能的函数库,支持HTTP,HTTPS,FTP,TELNET等协议和各种SSL安全认证。

 libcurl是开源项目,可以在其官网下载:http://curl.haxx.se/libcurl/

三. 基于libcurl的程序里主要用回调函数形式完全成任务,用户在启动传输前先设好各类参数和回调函数,当条件满足时libcurl再调用用户的回调实现特定功能。libcurl工作模式主要有两种:简单接口和多线程接口。简单接口可以实现同步、快速的文件传输;多线程接口则可生成多个连接线程以异步方式进行文件传输。

四. 使用简单接口的工作流程

五. 主要函数

1. CURLcode curl_global_init(long flags);

这个函数只能使用一次,如果在程序中没有显式调用,第一次调用curl_easy_init()时会自动调用它。因此在多线程接口中,要在主函数中显式调用。参数flags用于指定初始化状态,可选范围:

  CURL_GLOBAL_ALL:初始化所有可能的调用

  CURL_GLOBAL_SSL:初始化支持安全套接字的调用

  CURL_GLOBAL_WIN32:初始化WIN32套接字库

  CURL_GLOBAL_NOTHING:没有额外的初始化要求

结束libcurl调用时,可使用curl_global_init()清理内存

2. CURL *curl_easy_init();

获得一个CURL操作符,类似文件操作中FILE *fp = fopen(...)

3. void curl_easy_cleanup(CURL *handle);

CRUL操作符使用完后,使用它进行内存清理

4. CURL curl_easy_setopt(CURL *handle, CURLoption, parameter);

进行数据传输前必须告诉libcurl如何工作,使用这个函数指定工作方式。CURLoption有大量的可选值,不同可选值的参数也不相同。下一节专门说这个。

5. CURLcode curl_easy_perform(CURL *handle);

设好工作方式后,调用该函数执行相关操作

六. 一个例子

int ftp_log(CURL *curl, curl_infotype type, char *str, size_t size, void* stream)
{
    //打印CURLINFO_TEXT信息
    if ( CURLINFO_TEXT == type )
    {
        fwrite(str, 1, size, (FILE *)stream);
    }
}

int main(void)
{

CURL        *curl;

CURLcode     res;

char         error_buff[CURL_ERROR_SIZE];

FILE         *resource_file_fp, *log_file_fp;

 char        user_name[255] = "xxxx";

char        password[255] = "xxxx";

char         log_file_name[255] = "ftp.log";

char        file_name[255] = "/home/ls/hello.txt";    //源文件路径

char        ftp_url[1024] = "ftp://192.168.0.169//home/zyh/test.txt";

struct curl_slist     *slist = NULL;

//打开日志文件
    if (NULL == (log_file_fp = fopen(log_file_name, "a+")) )
    {
        return -1;
    }

//打开源文件
    if (NULL == (resource_file_fp = fopen(file_name, "r")) )
    {
        fclose(log_file_fp);
        return -1;
    }

//获取源文件大小

fseek(resource_file_fp, 0, SEEK_END);

gint resource_file_size = ftell(resource_file_fp);

if (resource_file_size < 0)
    {

fclose(log_file_fp);

fclose(resource_file_fp);

return -1;
    }
    fseek(resource_file_fp, 0, SEEK_SET);

//初始化libcurl
    if ( (res = curl_global_init(CURL_GLOBAL_ALL)) != 0 )
    {

fclose(log_file_fp);

fclose(resource_file_fp);

return -1;
    }

//创建libcurl标识符
    if((curl = curl_easy_init()) == NULL)
    {

fclose(log_file_fp);

fclose(resource_file_fp);

curl_global_cleanup();

return -1;
    }

snprintf(login_str, 255, "%s:%s", user_name,password);

//设置各类选项
    curl_easy_setopt(curl, CURLOPT_URL, ftp_url);
    curl_easy_setopt(curl, CURLOPT_USERPWD, login_str);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
    curl_easy_setopt(curl, CURLOPT_DEBUGDATA, log_file_fp);
    curl_easy_setopt(curl, CURLOPT_READDATA, resource_file_fp); //没有专门写读源文件回调函数,CURLOPT_READDATA会自动读取
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);
    curl_easy_setopt(curl, CURLOPT_INFILESIZE, resource_file_size);
    curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1);
    curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, ftp_log);

//curl运行
    res = curl_easy_perform(curl);
    if (0 != res)
    {

printf("res: %d \n", res);

fclose(resource_file_fp);

fclose(log_file_fp)

curl_easy_cleanup(curl);

curl_global_cleanup();

return -1;
    }
    curl_easy_cleanup(curl);

fclose(resource_file_fp);

fclose(log_file_fp);

curl_global_cleanup();

return 0;
}

libcurl简单接口的使用(FTP)相关推荐

  1. DJ14 简单接口电路及应用

    目录 一.I/O 接口 1. 接口和端口的关系 2. 接口的基本结构 3. 8086/8088 端口编址 二.简单接口芯片 1. 74LS244 三态门 2. 74LS273 锁存器 3. 74LS3 ...

  2. 后端入门之Python实现一个简单接口编写

    最近好像要转向后端了,故想提前学习下,实现一个简单接口编写,熟悉一下编写接口的流程和框架.写这个主要是记录一下自己的学习过程,以便后面温习.在Python实现一个简单接口编写之前需要了解一些后端开发的 ...

  3. 使用Flask开发简单接口

    使用Flask开发简单接口 作为测试人员,在工作或者学习的过程中,有时会遇到没有可以调用的现成的接口,导致我们的代码没法调试跑通的情况. 这时,我们使用python中的web框架Flask就可以很方便 ...

  4. libcurl简单介绍和使用

    1.libcurl简介 libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议.libcurl同样支持 ...

  5. php写简单接口_使用PHP如何编写简单的App接口

    这篇文章主要介绍了使用PHP编写简单的App接口的一些个人的步骤以及经验总结,有需要的小伙伴可以参考下 本篇是笔记尝试写的第一个PHP接口,并在iOS开发中尝试应用测试.今天给大家分享如何自己写接口来 ...

  6. flask接口mysql开发例子,使用Flask开发简单接口3–引入MySQL

    在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 在前两篇文章中,我们学习了通过Flask开发GET和POST请求接口,但是尚未实现操作数据库,因此,今天的目的是学习 ...

  7. 使用Django开发简单接口:文章增删改查

    目录 1.一些准备工作 安装django 创建django项目 创建博客应用(app) 2.models.py 3.django admin 登录 创建超级用户 4.修改urls.py 5.新增文章接 ...

  8. eNSP-配置路由器console接口密码与vty接口密码以及ftp服务

    拓扑图如下: 1,配置路由器R2的IP 2,配置服务器IP 3,配置路由器接口IP 4,配置console接口密码 5,在路由器上设置console接口密码成功 6,在路由器上配置vty接口密码 7, ...

  9. 如何在SpringBoot启动时执行初始化操作,两个简单接口就可以实现

    (一)概述 最近遇到一个功能点,数据库中一张很简单的表有一千多条数据,这里的数据主要做到了值域映射的作用,简单来讲就是我可以通过中文名拿到数据库中对应的code值.原本的实现方式是每次用到之后去查一次 ...

最新文章

  1. Ubuntu 下类似 Xshell 工具、更换阿里源
  2. 永成科技C++笔试题
  3. 字符串-字符串的查找和替换
  4. OpenGL 开发环境配置
  5. Python基础入门知识点——Python中的异常
  6. Netty技术细节源码分析-内存池之PoolChunk设计与实现
  7. localhost 就一定是 localhost 么?
  8. c语言实现图片卷积_卷积神经网络(CNN)Python的底层实现——以LeNet为例
  9. (40)FPGA面试技能提升篇(OAM与SDH协议)
  10. php mysql 地理位置_MySQL版中国省市区地址地区信息数据表
  11. 3650m5服务器内存选择 ibm_硬盘回收中心 服务器硬盘回收 监控硬盘回收
  12. java 索引实现,Java创建ES索引实现
  13. Easyui的numberbox无法输入以0开头的数字编号(转载)
  14. Beanutils基本用法
  15. 研究生数学建模大赛多久出结果_商学院研究生参加中国研究生数学建模竞赛获得重大突破...
  16. 电气工程cad实用教程电子版_电气工程CAD教程-PDF
  17. 计算机麦克风测试,如何进行电脑话筒测试?电脑麦克风如何设置?
  18. 人类常见的十大思维谬误
  19. 【C语言】从字符串中提取正整数和负整数
  20. 使用宏定义求圆的周长,面积

热门文章

  1. 网络变压器 POE、POE+及UPOE+功能的概念和技术原理
  2. MNN推理引擎最新实测,CPU、GPU性能全面领先!
  3. 2022年最新配置:Eslint+Prettier+Volar
  4. JSD-2204-API-JavaIO-Day02
  5. 凝望深渊,并发控制的尽头
  6. 启辰r30近光灯远光灯保险盒,近光灯故障处理
  7. android实现歌词的自动滚动
  8. 电脑鸿蒙系统怎么连接无线网络,手提电脑怎样连接WiFi?
  9. 锐龙5 6600H什么水平 r5 6600h核显相当于什么显卡
  10. R5 4650G和R5 5600G差距