libcurl简单接口的使用(FTP)

来源:互联网 发布:sql 小计 编辑:程序博客网 时间:2024/06/05 02:31

from sever2012的专栏
网络资料

一. 文件传输协议(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;
}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝账号被限制登录怎么办 辱骂买家被投诉骚扰怎么办 淘宝卖家骚扰买家怎么办 被淘宝卖家电话骚扰怎么办 闲鱼卖东西买家退货运费怎么办 淘宝被恶意拍单怎么办 炒作信用度评价被删除怎么办 删除淘宝评价之后卖家不返现怎么办 美团客户给差评怎么办 淘宝卖家评价差怎么办 淘宝卖家发货未揽收怎么办 周不过5我超过了怎么办 淘宝申请退款后卖家不确认怎么办 淘宝直通车b类扣12分怎么办 淘宝店铺被买家投诉怎么办 淘宝店铺遭买家投诉怎么办 淘宝店铺被买家恶意投诉怎么办 苹果手机无法识别指纹怎么办 淘宝店铺虚假交易违规怎么办 斗鱼直播太卡怎么办 神笔添加视频尺码不符合怎么办 闲鱼卖家单号填错了怎么办 户户通没有信号强度怎么办 全民k歌qq登不上怎么办 手机直播没电了怎么办 淘宝退货卖家拒收怎么办 充的会员卡店家关门了怎么办 淘宝手机号码被注册了怎么办 淘宝不支持七天无理由退货怎么办 微信视频横屏怎么办 房子里潮气太重怎么办 淘宝不小心注销了怎么办 淘宝号不小心注销了怎么办 xp网络驱动没了怎么办 淘宝卖家客服态度差怎么办 怀孕吃辣椒喉咙好痛怎么办 淘宝店铺建议不要提交认证怎么办 淘宝买东西商家不退款怎么办 淘宝买东西商家不发货怎么办 在微信上买东西被骗了怎么办 新浪微博自动关注人怎么办