1. 适用范围
本文档介绍SylixOS下通过curl中间件下载文件的流程,使用者应熟悉SylixOS以及curl中间件。
2. 下载流程
2.1 资源准备
文件下载依赖curl中间件,故下载前需基于SylixOS进行curl中间件移植,移植过程本文档不做详细介绍,请参照《SylixOS下中间件移植手册》。
2.2 下载流程
文件下载前需获取可用的下载url,使用curl中间件提供的接口进行文件下载。下载流程如程序清单 2.1所示。
程序清单 2.1 文件下载流程
#include <stdio.h>
#include <string.h>
#include "curl/curl.h"
/***************************************************************************
** 函数名称: write_data
** 功能描述: 回调函数
** 输 入 : ptr 写数据指针
** size 写入块字节数
** nmemb 写数据块数
** stream 目标文件指针
** 输 出 : 写入块数
** 返 回 : written
***************************************************************************/
size_t write_data (void *ptr, size_t size, size_t nmemb, FILE *stream)
{
size_t written = fwrite(ptr, size, nmemb, stream);
return written;
}
/***************************************************************************
** 函数名称: fileDownload
** 功能描述: 下载函数
** 输 入 : pcAddressUrl 下载地址
** pcFileName 下载文件名
** 输 出 : NONE
** 返 回 : ERROR_NONE
***************************************************************************/
int fileDownload (char *pcAddressUrl, char *pcFileName)
{
CURLcode curlRet;
CURL *curl = LW_NULL;
FILE *fp = LW_NULL;
char *url = pcAddressUrl; /* 下载网址 */
char *filename = pcFileName; /* 下载文件名字 */
curl = curl_easy_init(); /* 初始化 curl 会话 */
if (!curl) {
printf("curl_easy_init failed\n");
return (PX_ERROR);
}
fp = fopen(filename, "w+"); /* 打开文件 */
if (!fp) {
printf("fopen failed\n");
return (PX_ERROR);
}
curlRet = curl_easy_setopt(curl, CURLOPT_URL, url); /* 设置 url */
if (curlRet != CURLE_OK) {
fclose(fp);
curl_easy_cleanup(curl);
return (PX_ERROR);
}
curlRet = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);/* 设置回调函数 */
if (curlRet != CURLE_OK) {
fclose(fp);
curl_easy_cleanup(curl);
return (PX_ERROR);
}
curlRet = curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); /* 设置写入文件句柄 */
if (curlRet != CURLE_OK) {
fclose(fp);
curl_easy_cleanup(curl);
return (PX_ERROR);
}
curlRet = curl_easy_perform(curl); /* 完成传输函数 */
if (curlRet != CURLE_OK) {
fclose(fp);
curl_easy_cleanup(curl);
return (PX_ERROR);
}
fclose(fp);
curl_easy_cleanup(curl); /* 释放内存 */
return (ERROR_NONE);
}
/***************************************************************************
** 函数名称: main
** 功能描述: 进程主函数
** 输 入 : argc 入参个数
** argv 入参数组
** 输 出 : NONE
** 返 回 : ERROR_CODE
***************************************************************************/
int main (int argc, char **argv)
{
int iRet = -1;
printf("start download...\n");
/*
* 下载文件
* UPDATE_URL 下载地址
* UPDATE_FILE_NAME 下载保存文件名
*/
iRet = fileDownload(UPDATE_URL, UPDATE_FILE_NAME);
if (iRet != ERROR_NONE) {
printf("file down failed\n");
return (PX_ERROR);
}
return (ERROR_NONE);
}
参考资料:libcurl官网源码
转载于:https://blog.51cto.com/12558126/2122615