1. 適用範圍
本文檔介紹SylixOS下經過curl中間件下載文件的流程,使用者應熟悉SylixOS以及curl中間件。數組
2. 下載流程
2.1 資源準備
文件下載依賴curl中間件,故下載前需基於SylixOS進行curl中間件移植,移植過程本文檔不作詳細介紹,請參照《SylixOS下中間件移植手冊》。curl
2.2 下載流程
文件下載前需獲取可用的下載url,使用curl中間件提供的接口進行文件下載。下載流程如程序清單 2.1所示。函數
程序清單 2.1 文件下載流程url
#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官網源碼spa