libcurl简单接口的使用(FTP)
转自: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)相关推荐
- DJ14 简单接口电路及应用
目录 一.I/O 接口 1. 接口和端口的关系 2. 接口的基本结构 3. 8086/8088 端口编址 二.简单接口芯片 1. 74LS244 三态门 2. 74LS273 锁存器 3. 74LS3 ...
- 后端入门之Python实现一个简单接口编写
最近好像要转向后端了,故想提前学习下,实现一个简单接口编写,熟悉一下编写接口的流程和框架.写这个主要是记录一下自己的学习过程,以便后面温习.在Python实现一个简单接口编写之前需要了解一些后端开发的 ...
- 使用Flask开发简单接口
使用Flask开发简单接口 作为测试人员,在工作或者学习的过程中,有时会遇到没有可以调用的现成的接口,导致我们的代码没法调试跑通的情况. 这时,我们使用python中的web框架Flask就可以很方便 ...
- libcurl简单介绍和使用
1.libcurl简介 libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议.libcurl同样支持 ...
- php写简单接口_使用PHP如何编写简单的App接口
这篇文章主要介绍了使用PHP编写简单的App接口的一些个人的步骤以及经验总结,有需要的小伙伴可以参考下 本篇是笔记尝试写的第一个PHP接口,并在iOS开发中尝试应用测试.今天给大家分享如何自己写接口来 ...
- flask接口mysql开发例子,使用Flask开发简单接口3–引入MySQL
在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 在前两篇文章中,我们学习了通过Flask开发GET和POST请求接口,但是尚未实现操作数据库,因此,今天的目的是学习 ...
- 使用Django开发简单接口:文章增删改查
目录 1.一些准备工作 安装django 创建django项目 创建博客应用(app) 2.models.py 3.django admin 登录 创建超级用户 4.修改urls.py 5.新增文章接 ...
- eNSP-配置路由器console接口密码与vty接口密码以及ftp服务
拓扑图如下: 1,配置路由器R2的IP 2,配置服务器IP 3,配置路由器接口IP 4,配置console接口密码 5,在路由器上设置console接口密码成功 6,在路由器上配置vty接口密码 7, ...
- 如何在SpringBoot启动时执行初始化操作,两个简单接口就可以实现
(一)概述 最近遇到一个功能点,数据库中一张很简单的表有一千多条数据,这里的数据主要做到了值域映射的作用,简单来讲就是我可以通过中文名拿到数据库中对应的code值.原本的实现方式是每次用到之后去查一次 ...
最新文章
- Ubuntu 下类似 Xshell 工具、更换阿里源
- 永成科技C++笔试题
- 字符串-字符串的查找和替换
- OpenGL 开发环境配置
- Python基础入门知识点——Python中的异常
- Netty技术细节源码分析-内存池之PoolChunk设计与实现
- localhost 就一定是 localhost 么?
- c语言实现图片卷积_卷积神经网络(CNN)Python的底层实现——以LeNet为例
- (40)FPGA面试技能提升篇(OAM与SDH协议)
- php mysql 地理位置_MySQL版中国省市区地址地区信息数据表
- 3650m5服务器内存选择 ibm_硬盘回收中心 服务器硬盘回收 监控硬盘回收
- java 索引实现,Java创建ES索引实现
- Easyui的numberbox无法输入以0开头的数字编号(转载)
- Beanutils基本用法
- 研究生数学建模大赛多久出结果_商学院研究生参加中国研究生数学建模竞赛获得重大突破...
- 电气工程cad实用教程电子版_电气工程CAD教程-PDF
- 计算机麦克风测试,如何进行电脑话筒测试?电脑麦克风如何设置?
- 人类常见的十大思维谬误
- 【C语言】从字符串中提取正整数和负整数
- 使用宏定义求圆的周长,面积