学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装
在這一系列的前一篇文章學(xué)了C語言,如何為下載狂人寫一個(gè)磁盤剩余容量監(jiān)控程序?中,我們?yōu)橄螺d狂人寫了一個(gè)程序來監(jiān)視磁盤的剩余容量,防止下載的東西撐爆了硬盤。可是,這兩天,他又抱怨他的下載程序不好用,讓我們幫他寫一個(gè)下載程序。
雖然我們學(xué)了C語言,雖說學(xué)了C語言,走遍天下都不怕,但是要想用C語言寫一個(gè)全新的下載程序,對(duì)我們來說,就好比另外一個(gè)二萬五千里長征。雖然技術(shù)上可行,但是在實(shí)際操作中卻是行不通的。誰也不會(huì)傻到去用C語言寫一個(gè)全新的下載程序。那么,到底怎么辦呢?
如果我們看了《C程序設(shè)計(jì)伴侶》的7.A 站在巨人的肩膀上——如何使用已有的函數(shù)庫這個(gè)節(jié),要想解決這個(gè)問題,那簡(jiǎn)直就是“灑灑水啦”。在這個(gè)小節(jié)中,我們介紹了如何借助一些已有的函數(shù)庫來幫助我們高質(zhì)量高效率地完成一些常見任務(wù)。而其中介紹的CURL,正好是一個(gè)可以用于網(wǎng)絡(luò)下載的開源函數(shù)庫。
實(shí)際上,CURL有兩種工作方式,其一,它是一個(gè)用URL語法在命令行方式下工作的文件傳輸工具。我們可以使用curl.exe直接在命令行下下載文件。其二,它也是一個(gè)開源的函數(shù)庫,它提供了libcurl這個(gè)函數(shù)庫,其中提供了多個(gè)可以用于處理網(wǎng)絡(luò)事務(wù)(諸如下載,登陸,POST等)的API,利用這些API,我們就可以輕松地完成一個(gè)下載程序,這就好像坐上了飛機(jī),片刻之間,就從江西瑞金到了陜北延安,一步完成二萬五千里長征。
CURL的使用非常簡(jiǎn)單,跟其他類似的開源的函數(shù)庫一樣,其使用分為編譯函數(shù)庫和使用函數(shù)庫兩個(gè)步驟。
編譯CURL函數(shù)庫
在這里,我們以在Windows環(huán)境下,利用Visual C++ 2012編譯為例。如果是其他環(huán)境,可以參考其文檔,也很詳盡。
F:\>cd code\curl-7.28.1d\winbuild
F:\code\curl-7.28.1d\winbuild>
?
至此,整個(gè)編譯安裝過程就算完成了,這樣我們就可以在我們自己的程序中調(diào)用CURL所提供的API來完成文件下載的功能。這就像飛機(jī)已經(jīng)加滿了油,正停在跑道上等待起飛!
塔臺(tái)塔臺(tái),CL2013次航班準(zhǔn)備完畢,請(qǐng)求起飛。
現(xiàn)在,我們就可以利用其中提供的API來簡(jiǎn)便地實(shí)現(xiàn)一個(gè)系在程序。 /** get.c* 簡(jiǎn)易下載程序* Created on: 2013年11月1日11:13:10* Author: Bruce*/#include <curl/curl.h> #include <string.h> //用#pragam comment預(yù)編譯命令,表示這個(gè)程序?qū)⑹褂胠ibcurld_imp.lib這個(gè)文件 #pragma comment(lib,"libcurl.lib")//復(fù)制將數(shù)據(jù)寫入文件的回調(diào)函數(shù),關(guān)于回調(diào)函數(shù),可以參考C程序設(shè)計(jì)伴侶8.5.4小節(jié)介紹 size_t write_data(void * ptr,size_t size,size_t nmemb,FILE * stream) {int written = fwrite(ptr,size,nmemb,stream);return written; }//使用函數(shù)庫所提供函數(shù)實(shí)現(xiàn)文件下載函數(shù) CURLcode download(char * url,char * out) //char * url待下載文件的URL,char * out 下載后的文件名 {CURL * curl = NULL;FILE * fp = NULL;CURLcode res;//調(diào)用函數(shù)庫中的curl_easy_init()函數(shù)完成初始化curl = curl_easy_init();if(curl) //判斷初始化是否成功 {//以二進(jìn)制可寫方式打開文件,保存下載得到的數(shù)據(jù)fp = fopen(out,"wb");//根據(jù)libcurl的使用方法,設(shè)定下載的URL,寫入函數(shù)以及寫入的文件 curl_easy_setopt(curl,CURLOPT_URL,url);curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,write_data);curl_easy_setopt(curl,CURLOPT_WRITEDATA,fp);//調(diào)用curl_easy_perform()函數(shù)執(zhí)行下載操作res = curl_easy_perform(curl);//下載完成,進(jìn)行最后的清理工作 curl_easy_cleanup(curl);//關(guān)閉文件 fclose(fp);return res;}else{//如果初始化失敗,返回相應(yīng)的錯(cuò)誤代碼return CURL_FAILED_INIT;} }//輔助函數(shù),用于從URL中獲得文件名 void getfilename(char * url,char * name) {//找到URL中的最后一個(gè)‘/’字符char* pos = strrchr(url,'/');if(NULL != pos){//將URL中文件名(從pos+1開始知道字符串結(jié)束)復(fù)制到name字符串中strcpy(name,pos+1);} }//帶有參數(shù)的主函數(shù),可以讓用戶在執(zhí)行時(shí),直接輸入待下載文件的URL // 例如,如果我們想要下載libcurl的源代碼包,則可以直接輸入: // get http://curl.haxx.se/download/curl-7.24.0.zip // 關(guān)于帶參數(shù)的主函數(shù),可以參考8.7.3小節(jié) int main(int argc,char* argv[]) {//獲取用戶輸入的URL,判斷使用方法是否正確if(2 != argc){// 提示正確的使用方法puts("usage: get http://curl.haxx.se/download/curl-7.24.0.zip");return -1;}//獲取URL中的文件名char* url = argv[1];char name[32] = "";getfilename(url,name);// 調(diào)用函數(shù)庫所提供函數(shù)實(shí)現(xiàn)的download()函數(shù), 完成文件的下載CURLcode res = download(url,name);// 根據(jù)返回結(jié)果,提示用戶下載成功與否if(CURLE_OK == res){printf("great! download %s as %s succesfully.",url,name);}else{printf("sorry:( cannot download %s.",url);}return 0; } 代碼中的注釋已經(jīng)非常詳盡了,這里就不再多加解釋了。如果看完注釋,還是有不明白的地方,或者想更加深入地了解這個(gè)程序, 可以參考《C程序設(shè)計(jì)伴侶》的第七章關(guān)于這個(gè)例子的介紹。 現(xiàn)在,我們可以用如下命令編譯這個(gè)程序: cl /TP get.c 編譯后,得到get.exe,也就是我們?yōu)橄螺d狂人寫的下載程序。(這里的/TP讓你覺得有點(diǎn)不舒服? 那么看看學(xué)了C語言,如何利用cURL寫一個(gè)下載程序?——在MinGW環(huán)境下實(shí)現(xiàn)) 下載程序的開發(fā)簡(jiǎn)單,其 使用就更簡(jiǎn)單了,比如我們要下載cURL的源代碼, 可以使用下面的命令: get.exe http://curl.haxx.se/download/curl-7.28.1.zip 利用cURL,不到一百行代碼,我們輕松地完成了一個(gè)下載程序,當(dāng)然,如果你有興趣,還可以進(jìn)一步完善,比如加上進(jìn)度提示等等。 這個(gè)事例也告訴我們一個(gè)道理: 學(xué)會(huì)站在巨人的肩膀上,可以收到事半功倍的效果 我們介紹了如何在Windows平臺(tái)的Visual C++環(huán)境下利用cURL快速高效地實(shí)現(xiàn)一個(gè)下載程序。但是有朋友反饋說,“這是在用C++代碼冒充C代碼”。這位朋友說的很有道理,這是因?yàn)?Visual C++對(duì)C語言的支持并不十分完善,為了使用C語言中的一些新特性,我在編譯最終代碼的時(shí)候,加上了一個(gè)/TP選項(xiàng),這實(shí)際上是將.c文件當(dāng)作.cpp文 件來編譯了,也就是把C語言代碼視作了C++代碼。這里需要說明的是,我們?cè)诖a中用到的全是C語言,只是在編譯的時(shí)候采取了一些曲線救國的策略。雖然用/TP的方式可以解決問題,但是看起來總有些旁門左道的感覺。幸運(yùn)的是,在Windows平臺(tái)上,不只有Visual C++這一款編譯器,還有其他的C語言編譯器,比如,MInGW就是其中應(yīng)用比較廣泛的一款。利用MinGW,我們同樣可以完成整個(gè)過程,同時(shí)還更加簡(jiǎn) 單。
- libcurl.a 靜態(tài)鏈接庫文件?
- libcurldll.a 動(dòng)態(tài)鏈接庫的導(dǎo)入庫
- libcurl.dll 動(dòng)態(tài)鏈接庫
整體來看,MinGW環(huán)境下libcurl的使用跟在Visual C++環(huán)境下的使用是相似的,只是MinGW對(duì)C語言的支持根據(jù)完善,看起來更加名門正派一些。總之,兩種環(huán)境下都可以實(shí)現(xiàn),而具體使用哪一種,就看你自己的喜好了。
轉(zhuǎn)自:http://www.howzhi.com/course/3387/lesson/43112
轉(zhuǎn)載于:https://www.cnblogs.com/kingshow123/p/easydown.html
總結(jié)
以上是生活随笔為你收集整理的学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML5 Web app开发工具Ken
- 下一篇: 字符串过滤