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官网源码