freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

bt軟件下載開發(fā)完整版-01-資料下載頁

2025-08-12 08:16本頁面

【導(dǎo)讀】沖區(qū)中,在達到一定的數(shù)值時再將數(shù)據(jù)寫入硬盤的文件中。peer請求數(shù)據(jù)時,先在緩沖區(qū)中尋找,若緩沖區(qū)中不存在所請求的數(shù)據(jù),則讀文件并把請求數(shù)據(jù)所在的piece預(yù)先讀入到緩沖區(qū)中。本模塊由和構(gòu)成。每個緩沖區(qū)結(jié)點的大小為16KB,默認生成1024個結(jié)點,總大小為16MB。用要么全部空閑。第1~16個結(jié)點存放一個piece,第17~32個結(jié)點存放一個piece,依此類推。了方便處理,所有緩沖區(qū)在程序啟動時統(tǒng)一申請,在程序結(jié)束時一起被釋放。

  

【正文】 4) write_btcache_to_harddisk(peer)。 if(i == 3) release_read_btcache_node(16)。 if(i == 2) release_read_btcache_node(8)。 if(i == 1) release_read_btcache_node(0)。 i。 } // 如果還沒有空閑的緩沖區(qū) ,丟棄下載到的這個 slice printf(+++++ write a slice to btcache FAILED :NO BUFFER +++++\n)。 clear_btcache()。 return 0。 } ? int read_slice_for_send(int index,int begin,int length,Peer *peer) 功能:從緩沖區(qū)獲取一個 slice,讀取的 slice 存放到 peer 的發(fā)送緩沖區(qū)中。若緩沖區(qū)中不存在該 slice,則從硬盤讀 slice 所在的 piece 到緩沖區(qū)中。函數(shù)的實現(xiàn)代碼如下: int read_slice_for_send(int index,int begin,int length,Peer *peer) { Btcache *p = btcache_head, *q。 // q指針指向每個 piece的第一個 slice int ret。 // 檢查參數(shù)是否有誤 if(index=pieces_length/20 || beginpiece_length16*1024) return 1。 ret = get_bit_value(bitmap,index)。 if(ret 0) { printf(peer requested slice did not download\n)。 return 1。 } if(index == last_piece_index) { read_slice_for_send_last_piece(index,begin,length,peer)。 return 0。 } // 緩沖區(qū)中已存在待獲取的 slice while(p != NULL) { if( pindex==index amp。amp。 pbegin==begin amp。amp。 plength==length amp。amp。 pin_use==1 amp。amp。 pis_full==1 ) { // 構(gòu)造 piece消息 ret = create_piece_msg(index,begin,pbuff,plength,peer)。 if(ret 0) { printf(Function create piece msg error\n)。 return 1。 } paccess_count = 1。 return 0。 // 函數(shù)返回 } p = pnext。 } int i = 4, count, slice_count, unuse_count。 while(i 0) { slice_count = piece_length / (16*1024)。 count = 0。 // 計數(shù)當前指向第幾個 slice 461 項目實踐: BT 下載軟件的開發(fā) 第章 13 p = btcache_head。 while(p != NULL) { if(count%slice_count == 0) { unuse_count = 0。 q = p。 } if(pin_use == 0) unuse_count++。 if(unuse_count == slice_count) break。 // 找到一個空閑的 piece count++。 p = pnext。 } if(p != NULL) { read_piece_from_harddisk(q,index)。 p = q。 while(p != NULL) { if(pindex==index amp。amp。 pbegin==begin amp。amp。 plength==length amp。amp。 pin_use==1 amp。amp。 pis_full==1) { // 構(gòu)造 piece消息 ret = create_piece_msg(index,begin,pbuff,plength,peer)。 if(ret 0) { printf(Function create piece msg error\n)。 return 1。 } paccess_count = 1。 return 0。 // 函數(shù)返回 } p = pnext。 } } // 使緩沖區(qū)留 出空閑的區(qū)塊來存放 slice 所在的 piece if(i == 4) write_btcache_to_harddisk(peer)。 if(i == 3) release_read_btcache_node(16)。 if(i == 2) release_read_btcache_node(8)。 if(i == 1) release_read_btcache_node(0)。 i。 } // 如果 沒有緩沖區(qū)了 ,就不讀 slice所在的 piece 到緩沖區(qū)中 p = initialize_btcache_node()。 if(p == NULL) { printf(%s:%d allocate memory error,__FILE__,__LINE__)。 return 1。 } pindex = index。 pbegin = begin。 plength = length。 read_slice_from_harddisk(p)。 // 構(gòu)造 piece消息 ret = create_piece_msg(index,begin,pbuff,plength,peer)。 if(ret 0) { printf(Function create piece msg error\n)。 return 1。 } // 釋放剛剛申請的內(nèi)存 if(pbuff != NULL) free(pbuff)。 if(p != NULL) free(p)。 return 0。 } 由于 中其他函數(shù)較為簡單或與已列出的函數(shù)類似,限于篇幅不再列出,請參考本書所附的源代碼。 462 Linux 系統(tǒng) 下的 C 編程 策略管理模塊的設(shè)計和實現(xiàn) 策略管理模塊負責策略的實現(xiàn),主要是計算各個 peer 的下載和上傳速度,根據(jù)下載速度選擇非阻塞 peer,采用隨機算法選擇優(yōu)化非阻塞 peer,以及實現(xiàn)片斷選擇策略。本模塊由 和 構(gòu)成。 BT 協(xié)議的設(shè)計者也承認計算從各個 peer 處下載數(shù)據(jù)的速度是一個棘手的問題。經(jīng)過分析和對比, 現(xiàn)在通用的計算下載速度的方法是每 10 秒計算一次速度,統(tǒng)計最近 10 秒內(nèi)從每個 peer 處下載的數(shù)據(jù)量,然后除以時間,得到最近這段時間的下載速度,并將下載速度最快的 4 個 peer 解除阻塞,允許它們從本客戶端下載,除一個特殊的 peer 外其他 peer 將被阻塞。為了發(fā)現(xiàn)更快下載速度的 peer,任何時刻保證存在一個優(yōu)化非阻塞 peer,將這個 peer 解除阻塞,而暫時不管從該 peer處下載數(shù)據(jù)的速度,每隔 30 秒重新進行選擇。我們期望,在這 30 秒內(nèi),本客戶端提供給該 peer較快的下載速度,然后該 peer 將本客戶端解除阻塞,這樣就 可以從該 peer 處下載數(shù)據(jù),并在下次選擇非阻塞 peer 時,該 peer 能成為 4 個非阻塞 peer 中的一個。片斷選擇策略,也就是選擇下載哪些 slice,請參考前面部分的 BT 協(xié)議。 ifndef POLICY_H define POLICY_H include define COMPUTE_RATE_TIME 10 // 每隔 10秒計算一次各個 peer的下載和上傳速度 define UNCHOKE_COUNT 4 // 非阻塞 peer的 個數(shù) define REQ_SLICE_NUM 4 // 每次請求 slice的個數(shù) typedef struct _Unchoke_peers { Peer* unchkpeer[UNCHOKE_COUNT]。 // 保存非阻塞 peer的指針 int count。 // 記錄當前有多少個非阻塞 peer Peer* optunchkpeer。 // 保存優(yōu) 化非阻塞 peer的指針 } Unchoke_peers。 void init_unchoke_peers()。 // 初始化 unchoke_peers int select_unchoke_peer()。 // 選擇 unchoke peer int select_optunchoke_peer()。 // 從 peer隊列中選擇一個優(yōu)化非阻塞 peer int pute_rate()。 // 計算最近一段時間 (10s)每個 peer的上傳下載速度 int pute_total_rate()。 // 計算總的上傳下載速度 int is_seed(Peer *node)。 // 判斷某個 peer是否為種子 int create_req_slice_msg(Peer *node)。 // 構(gòu)造數(shù)據(jù)請求 endif 文件的頭部包含的代碼為: include include include include include include include include long long total_down = 0L, total_up = 0L。 // 總的下載量和上傳量 463 項目實踐: BT 下載軟件的開發(fā) 第章 13 float total_down_rate = , total_up_rate = 。 // 總的下載上傳速度 int total_peers = 0。 // 已連接的總 Peer數(shù) Unchoke_peers unchoke_peers。 // 存放非阻塞 Peer和優(yōu)化非阻塞 Peer的指針 extern int end_mode。 // 是否已進入終端模式 extern Bitmap *bitmap。 // 指向己方的位 圖 extern Peer *peer_head。 // 指向 Peer鏈表 extern int pieces_length。 // 所有 piece hash 值的長度 extern int piece_length。 // 每個 piece的長度 extern Btcache *btcache_head。
點擊復(fù)制文檔內(nèi)容
高考資料相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1