本文档介绍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官网源码
通过curl下载文件
原文地址:http://blog.51cto.com/12558126/2122615