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

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

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

以下是下載線程中三個(gè)關(guān)鍵性函數(shù)的算法描述(假定這三個(gè)函數(shù)都被封裝在CwebCopy類中)。
int CWebCopy::DownLoad(char * host,char?。猵ath,int a1,int a2,BYTE?。uf)
{
//本函數(shù)從host所指定的HTTP服務(wù)器上下載路徑為path的文件中從第a1字節(jié)到第a2字節(jié)的內(nèi)容,與host所指定的主機(jī)的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請(qǐng)求,下載當(dāng)前指定路徑下的文件的一部分
Send(sock,“GET path%cHost:?。%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ù),則認(rèn)為超時(shí)
if(readen < 1) return?。?;
//接收數(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所指向的遠(yuǎn)程HTTP服務(wù)器
char BUF[1024];
va_list argptr;
//處理可變個(gè)數(shù)參數(shù)
va_start(argptr,fmt);
//將參數(shù)整理成字符串后放入BUF中
vsprintf(BUF,fmt,argptr);
va_end(argptr);
//將BUF中的字符串發(fā)送到sock所指向的遠(yuǎn)程服務(wù)器
return send(sock ,BUF,strlen(BUF),0);
}
int CWebCopy ::ReadEn(int sock,struct timeval tv,int tryloop)
{
//利用select函數(shù)檢驗(yàn)套接字sock,如果套接字接收到數(shù)據(jù)則返回“讀使能”,如果出現(xiàn)“內(nèi)部中斷”以外的錯(cuò)誤,則返回 “讀禁止”
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)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉