www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]筆者通過自己的摸索,在集成開發(fā)環(huán)境KDevelop 1.2下實現(xiàn)了一個網(wǎng)站下載程序,它支持文件級的“多線程下載”和“斷點續(xù)傳”。

有許多網(wǎng)絡(luò)文件下載工具可以在Windows平臺下很好地工作,如NetAnts、“網(wǎng)際快車”、TelePro等,還有像WebZip那樣功能強大的離線瀏覽器。這些工具使我們可以在Windows環(huán)境下很輕松地下載網(wǎng)站上的文件、目錄、網(wǎng)站的一部分,甚至整個網(wǎng)站。然而在Linux環(huán)境下,這類工具卻很少。筆者通過自己的摸索,在集成開發(fā)環(huán)境KDevelop 1.2下實現(xiàn)了一個網(wǎng)站下載程序,它支持文件級的“多線程下載”和“斷點續(xù)傳”。下面本文分3部分介紹實現(xiàn)這一程序的基本技術(shù)。
基本原理
1.超級鏈接尋徑算法
要想靈活地下載一個網(wǎng)站的全部或部分內(nèi)容,程序就必需具備從用戶指定的URL開始,沿著它所包含的超級鏈接遍歷整個網(wǎng)站的能力。在這個基礎(chǔ)上根據(jù)用戶的限制,篩選出所要下載的文件。
從“圖論”的角度分析,網(wǎng)站其實是一個由文件和超級鏈接組成的“連通有向圖”。文件是圖中的頂點,超級鏈接是有向邊。我們需要對這個有向圖進行“廣度優(yōu)先遍歷”。為此,需要用一個隊列URLQueue來存放待訪問的目標。初始情況下,隊列中只含有用戶指定的那個URL。程序從隊頭取得下載目標的URL,如果它符合用戶的限制,就下載它指向的文件。分析此文件,找出其中包括的超級鏈接,生成新的下載目標的URL,然后將它們插入到隊列尾部。重復(fù)以上過程,直到隊列中沒有符合用戶限制的URL為止。
由于網(wǎng)站是一個“連通有向圖”,所以沿著超級鏈接,很可能回到已經(jīng)訪問過的文件。為了避免程序出現(xiàn)死循環(huán),要登記已經(jīng)訪問過的目標。在分析下載文件的超級鏈接時,我們要將生成的新目標的URL與已經(jīng)訪問過的進行比較,剔除會造成重復(fù)訪問的URL。為了提高查詢速度,我們采用了“哈希表”來存放從隊頭取出的URL。“哈希函數(shù)”可以采用將URL中的字符作為整型值相加,然后模一個質(zhì)數(shù)的簡單方法來實現(xiàn)。在本文介紹的程序中使用了質(zhì)數(shù)103。
2.多線程下載和斷點續(xù)傳
多線程下載和斷點續(xù)傳使用了同一個技術(shù)。HTTP協(xié)議允許客戶端在向服務(wù)器端發(fā)送下載一個文件的GET請求時,使用“Range: bytes=a1-a2"選項,要求服務(wù)器只傳送指定文件中從第a1個字節(jié)到a2個字節(jié)之間的部分內(nèi)容。因此下載一個文件時,可以將其分成若干段,然后啟動多個線程,同時與服務(wù)器建立鏈接,分別傳送一個文件的多個部分。最后在本地將其拼接成一個完整的文件。由于從網(wǎng)上下載文件時,瓶頸是在服務(wù)器端和網(wǎng)絡(luò)傳輸過程中,所以采用多線程同時下載將大大提高下載速度。
當文件傳輸因出現(xiàn)問題而中斷時,程序可以將各個線程當前下載的進度和已經(jīng)下載的內(nèi)容當做“斷點信息”保存到文件中。用戶下一次下載同一目標時,程序可以根據(jù)文件中保留的斷點信息下載上次未完成的部分,然后將整個文件拼接起來,完成下載工作。這種技術(shù)對于在經(jīng)常“掉線”的情況下下載大文件非常有利。因此,在當前流行的下載軟件中都采用了此項技術(shù)。
Linux如何啟動線程
1.定義一個以void?。獮閰?shù)、返回void?。暮瘮?shù)。例如,為了啟動下載線程,需要定義如下函數(shù):
void?。tart(void?。rg)
{
((CWebCopy?。? arg)->DownLoad();
return arg;
}
2.在需要啟動線程時,只要三條語句。例如,啟動下載線程的代碼如下:
#include
pthread_t tid;
pthread_create(&tid,NULL,start,arg);
部分程序的實現(xiàn)

以下是下載線程中三個關(guān)鍵性函數(shù)的算法描述(假定這三個函數(shù)都被封裝在CwebCopy類中)。
int CWebCopy::DownLoad(char?。ost,char?。猵ath,int a1,int a2,BYTE?。uf)
{
//本函數(shù)從host所指定的HTTP服務(wù)器上下載路徑為path的文件中從第a1字節(jié)到第a2字節(jié)的內(nèi)容,與host所指定的主機的80端口(HTTP端口)建立流式鏈接,共嘗試5次
bool connected = false;
int sock; //用于存放套接字描述符
for(i = 0; i < 5 ; i++){
if((sock = Connect(host,80)) < 0)
sleep(1);
else{
connected = true;
break;
}
}
if(connected){
//向指定的HTTP服務(wù)器發(fā)送GET請求,下載當前指定路徑下的文件的一部分
Send(sock,“GET path%cHost: %s%cRange: bytes=%d-%d%c”,path,10,host,10,a1,a2,10);
int inflen,index = 0;
while(1){
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
//檢查套接字是否接收到了數(shù)據(jù),嘗試20次,每次間隔1秒
int readen;
readen =ReadEn(sock,tv,20);
//如果套接字中20秒內(nèi)仍然沒有數(shù)據(jù),則認為超時
if(readen < 1) return -1;
//接收數(shù)據(jù),并存放在信息緩沖區(qū)中
inflen=read(sock,(buf+index),a2-a1); // 如果此文件所需部分已經(jīng)下載結(jié)束
if(inflen <= 0) break;
}
return 0;
}
else return?。?;
}
int CWebCopy ::Send(int sock,char?。猣mt,...)
{
//本函數(shù)將指定的字符串發(fā)送到sock所指向的遠程HTTP服務(wù)器
char BUF[1024];
va_list argptr;
//處理可變個數(shù)參數(shù)
va_start(argptr,fmt);
//將參數(shù)整理成字符串后放入BUF中
vsprintf(BUF,fmt,argptr);
va_end(argptr);
//將BUF中的字符串發(fā)送到sock所指向的遠程服務(wù)器
return send(sock ,BUF,strlen(BUF),0);
}
int CWebCopy ::ReadEn(int sock,struct timeval tv,int tryloop)
{
//利用select函數(shù)檢驗套接字sock,如果套接字接收到數(shù)據(jù)則返回“讀使能”,如果出現(xiàn)“內(nèi)部中斷”以外的錯誤,則返回 “讀禁止”
fd_set rfdset;
FD_ZERO(&rfdset);
FD_SET(sock,&rfdset);
int readen = 0;
for(int i = 0; i < tryloop; i++){
readen = select(m_sock+1,&rfdset,NULL,NULL,&tv);
if(readen>0||(readen< 0?。ΓΑrrno !=EINTR))
break;
sleep(1);
}
return readen;
}

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉