日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

嵌入式linux如何下载程序,Linux平台的下载程序-嵌入式系统-与非网

發布時間:2025/5/22 linux 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌入式linux如何下载程序,Linux平台的下载程序-嵌入式系统-与非网 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有許多網絡文件下載工具可以在Windows平臺下很好地工作,如NetAnts、“網際快車”、TelePro等,還有像WebZip那樣功能強大的離線瀏覽器。這些工具使我們可以在Windows環境下很輕松地下載網站上的文件、目錄、網站的一部分,甚至整個網站。然而在Linux環境下,這類工具卻很少。筆者通過自己的摸索,在集成開發環境KDevelop 1.2下實現了一個網站下載程序,它支持文件級的“多線程下載”和“斷點續傳”。下面本文分3部分介紹實現這一程序的基本技術。

基本原理

1.超級鏈接尋徑算法

要想靈活地下載一個網站的全部或部分內容,程序就必需具備從用戶指定的URL開始,沿著它所包含的超級鏈接遍歷整個網站的能力。在這個基礎上根據用戶的限制,篩選出所要下載的文件。

從“圖論”的角度分析,網站其實是一個由文件和超級鏈接組成的“連通有向圖”。文件是圖中的頂點,超級鏈接是有向邊。我們需要對這個有向圖進行“廣度優先遍歷”。為此,需要用一個隊列URLQueue來存放待訪問的目標。初始情況下,隊列中只含有用戶指定的那個URL。程序從隊頭取得下載目標的URL,如果它符合用戶的限制,就下載它指向的文件。分析此文件,找出其中包括的超級鏈接,生成新的下載目標的URL,然后將它們插入到隊列尾部。重復以上過程,直到隊列中沒有符合用戶限制的URL為止。

由于網站是一個“連通有向圖”,所以沿著超級鏈接,很可能回到已經訪問過的文件。為了避免程序出現死循環,要登記已經訪問過的目標。在分析下載文件的超級鏈接時,我們要將生成的新目標的URL與已經訪問過的進行比較,剔除會造成重復訪問的URL。為了提高查詢速度,我們采用了“哈希表”來存放從隊頭取出的URL。“哈希函數”可以采用將URL中的字符作為整型值相加,然后模一個質數的簡單方法來實現。在本文介紹的程序中使用了質數103。

2.多線程下載和斷點續傳

多線程下載和斷點續傳使用了同一個技術。HTTP協議允許客戶端在向服務器端發送下載一個文件的GET請求時,使用“Range: bytes=a1-a2"選項,要求服務器只傳送指定文件中從第a1個字節到a2個字節之間的部分內容。因此下載一個文件時,可以將其分成若干段,然后啟動多個線程,同時與服務器建立鏈接,分別傳送一個文件的多個部分。最后在本地將其拼接成一個完整的文件。由于從網上下載文件時,瓶頸是在服務器端和網絡傳輸過程中,所以采用多線程同時下載將大大提高下載速度。

當文件傳輸因出現問題而中斷時,程序可以將各個線程當前下載的進度和已經下載的內容當做“斷點信息”保存到文件中。用戶下一次下載同一目標時,程序可以根據文件中保留的斷點信息下載上次未完成的部分,然后將整個文件拼接起來,完成下載工作。這種技術對于在經常“掉線”的情況下下載大文件非常有利。因此,在當前流行的下載軟件中都采用了此項技術。

Linux如何啟動線程

1.定義一個以void *為參數、返回void *的函數。例如,為了啟動下載線程,需要定義如下函數:

void * start(void * arg)

{

((CWebCopy *) arg)->DownLoad();

return arg;

}

2.在需要啟動線程時,只要三條語句。例如,啟動下載線程的代碼如下:

#include

pthread_t tid;

pthread_create(&tid,NULL,start,arg);

部分程序的實現

以下是下載線程中三個關鍵性函數的算法描述(假定這三個函數都被封裝在CwebCopy類中)。

int CWebCopy::DownLoad(char * host,char *path,int a1,int a2,BYTE * buf)

{

//本函數從host所指定的HTTP服務器上下載路徑為path的文件中從第a1字節到第a2字節的內容,與host所指定的主機的80端口(HTTP端口)建立流式鏈接,共嘗試5次

bool connected = false;

int sock; //用于存放套接字描述符

for(i = 0; i 

if((sock = Connect(host,80)) 

sleep(1);

else{

connected = true;

break;

}

}

if(connected){

//向指定的HTTP服務器發送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;

//檢查套接字是否接收到了數據,嘗試20次,每次間隔1秒

int readen;

readen =ReadEn(sock,tv,20);

//如果套接字中20秒內仍然沒有數據,則認為超時

if(readen 

//接收數據,并存放在信息緩沖區中

inflen=read(sock,(buf+index),a2-a1); // 如果此文件所需部分已經下載結束

if(inflen <= 0) break;

}

return 0;

}

else return -1;

}

int CWebCopy ::Send(int sock,char *fmt,...)

{

//本函數將指定的字符串發送到sock所指向的遠程HTTP服務器

char BUF[1024];

va_list argptr;

//處理可變個數參數

va_start(argptr,fmt);

//將參數整理成字符串后放入BUF中

vsprintf(BUF,fmt,argptr);

va_end(argptr);

//將BUF中的字符串發送到sock所指向的遠程服務器

return send(sock ,BUF,strlen(BUF),0);

}

int CWebCopy ::ReadEn(int sock,struct timeval tv,int tryloop)

{

//利用select函數檢驗套接字sock,如果套接字接收到數據則返回“讀使能”,如果出現“內部中斷”以外的錯誤,則返回 “讀禁止”

fd_set rfdset;

FD_ZERO(&rfdset);

FD_SET(sock,&rfdset);

int readen = 0;

for(int i = 0; i 

readen = select(m_sock+1,&rfdset,NULL,NULL,&tv);

if(readen>0||(readen

break;

sleep(1);

}

return readen;

}

分享到:

來源:互聯網

版權聲明:本網站轉載的所有的文章、圖片、音頻視頻文件等資料的版權歸版權所有人所有,本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如果本網所選內容的文章作者及編輯認為其作品不宜公開自由傳播,或不應無償使用,請及時通過電子郵件或電話通知我們,以迅速采取適當措施,避免給雙方造成不必要的經濟損失。

總結

以上是生活随笔為你收集整理的嵌入式linux如何下载程序,Linux平台的下载程序-嵌入式系统-与非网的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。