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

正文內(nèi)容

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

2025-08-12 08:16本頁(yè)面

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

  

【正文】 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ū) ,丟棄下載到的這個(gè) 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ū)獲取一個(gè) slice,讀取的 slice 存放到 peer 的發(fā)送緩沖區(qū)中。若緩沖區(qū)中不存在該 slice,則從硬盤讀 slice 所在的 piece 到緩沖區(qū)中。函數(shù)的實(shí)現(xiàn)代碼如下: int read_slice_for_send(int index,int begin,int length,Peer *peer) { Btcache *p = btcache_head, *q。 // q指針指向每個(gè) piece的第一個(gè) 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。 // 計(jì)數(shù)當(dāng)前指向第幾個(gè) slice 461 項(xiàng)目實(shí)踐: 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。 // 找到一個(gè)空閑的 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ū)塊來(lái)存放 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。 } // 釋放剛剛申請(qǐng)的內(nèi)存 if(pbuff != NULL) free(pbuff)。 if(p != NULL) free(p)。 return 0。 } 由于 中其他函數(shù)較為簡(jiǎn)單或與已列出的函數(shù)類似,限于篇幅不再列出,請(qǐng)參考本書所附的源代碼。 462 Linux 系統(tǒng) 下的 C 編程 策略管理模塊的設(shè)計(jì)和實(shí)現(xiàn) 策略管理模塊負(fù)責(zé)策略的實(shí)現(xiàn),主要是計(jì)算各個(gè) peer 的下載和上傳速度,根據(jù)下載速度選擇非阻塞 peer,采用隨機(jī)算法選擇優(yōu)化非阻塞 peer,以及實(shí)現(xiàn)片斷選擇策略。本模塊由 和 構(gòu)成。 BT 協(xié)議的設(shè)計(jì)者也承認(rèn)計(jì)算從各個(gè) peer 處下載數(shù)據(jù)的速度是一個(gè)棘手的問(wèn)題。經(jīng)過(guò)分析和對(duì)比, 現(xiàn)在通用的計(jì)算下載速度的方法是每 10 秒計(jì)算一次速度,統(tǒng)計(jì)最近 10 秒內(nèi)從每個(gè) peer 處下載的數(shù)據(jù)量,然后除以時(shí)間,得到最近這段時(shí)間的下載速度,并將下載速度最快的 4 個(gè) peer 解除阻塞,允許它們從本客戶端下載,除一個(gè)特殊的 peer 外其他 peer 將被阻塞。為了發(fā)現(xiàn)更快下載速度的 peer,任何時(shí)刻保證存在一個(gè)優(yōu)化非阻塞 peer,將這個(gè) peer 解除阻塞,而暫時(shí)不管從該 peer處下載數(shù)據(jù)的速度,每隔 30 秒重新進(jìn)行選擇。我們期望,在這 30 秒內(nèi),本客戶端提供給該 peer較快的下載速度,然后該 peer 將本客戶端解除阻塞,這樣就 可以從該 peer 處下載數(shù)據(jù),并在下次選擇非阻塞 peer 時(shí),該 peer 能成為 4 個(gè)非阻塞 peer 中的一個(gè)。片斷選擇策略,也就是選擇下載哪些 slice,請(qǐng)參考前面部分的 BT 協(xié)議。 ifndef POLICY_H define POLICY_H include define COMPUTE_RATE_TIME 10 // 每隔 10秒計(jì)算一次各個(gè) peer的下載和上傳速度 define UNCHOKE_COUNT 4 // 非阻塞 peer的 個(gè)數(shù) define REQ_SLICE_NUM 4 // 每次請(qǐng)求 slice的個(gè)數(shù) typedef struct _Unchoke_peers { Peer* unchkpeer[UNCHOKE_COUNT]。 // 保存非阻塞 peer的指針 int count。 // 記錄當(dāng)前有多少個(gè)非阻塞 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隊(duì)列中選擇一個(gè)優(yōu)化非阻塞 peer int pute_rate()。 // 計(jì)算最近一段時(shí)間 (10s)每個(gè) peer的上傳下載速度 int pute_total_rate()。 // 計(jì)算總的上傳下載速度 int is_seed(Peer *node)。 // 判斷某個(gè) peer是否為種子 int create_req_slice_msg(Peer *node)。 // 構(gòu)造數(shù)據(jù)請(qǐng)求 endif 文件的頭部包含的代碼為: include include include include include include include include long long total_down = 0L, total_up = 0L。 // 總的下載量和上傳量 463 項(xiàng)目實(shí)踐: 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。 // 是否已進(jìn)入終端模式 extern Bitmap *bitmap。 // 指向己方的位 圖 extern Peer *peer_head。 // 指向 Peer鏈表 extern int pieces_length。 // 所有 piece hash 值的長(zhǎng)度 extern int piece_length。 // 每個(gè) piece的長(zhǎng)度 extern Btcache *btcache_head。
點(diǎn)擊復(fù)制文檔內(nèi)容
高考資料相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1