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

正文內(nèi)容

bt軟件下載開(kāi)發(fā)完整版-01(編輯修改稿)

2024-09-26 08:16 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 p = pnext。 } } return 0。 } 454 Linux 系統(tǒng) 下的 C 編程 ? int read_slice_from_harddisk(Btcache *node) 功能:從硬盤(pán)讀一個(gè) slice 的數(shù)據(jù),存放到緩沖區(qū)中,在 peer 需要時(shí)發(fā)送給 peer。 該函數(shù)非常類似于 write_btcache_node_to_harddisk,限于篇幅此處不再列出。 具體代碼請(qǐng)參考本書(shū)所附源代碼。 ? int write_piece_to_harddisk(int sequence,Peer *peer) 功能:檢查下載完的一個(gè) piece 的數(shù)據(jù)是否正確,若正確則寫(xiě)入文件。 參數(shù): sequence 是存放 piece 的第一個(gè) slice 的 Btcache 結(jié)點(diǎn)編號(hào),該值的范圍為 0~ 1023 中16 的整數(shù)值函數(shù)實(shí)現(xiàn)代碼如下所示: int write_piece_to_harddisk(int sequence,Peer *peer) { Btcache *node_ptr = btcache_head, *p。 unsigned char piece_hash1[20], piece_hash2[20]。 int slice_count = piece_length / (16*1024)。 // 一個(gè) piece所含的 slice數(shù) int index, index_copy。 if(peer==NULL) return 1。 int i = 0。 while(i sequence) { node_ptr = node_ptrnext。 i++。 } p = node_ptr。 // p指針指向 piece的第一個(gè) slice所在的 btcache結(jié)點(diǎn) // 計(jì)算剛剛下載到的這個(gè) piece的 hash 值 SHA1_CTX ctx。 SHA1Init(amp。ctx)。 while(slice_count0 amp。amp。 node_ptr!=NULL) { SHA1Update(amp。ctx,node_ptrbuff,16*1024)。 slice_count。 node_ptr = node_ptrnext。 } SHA1Final(piece_hash1,amp。ctx)。 // 從種子文件中獲取該 piece的正確的 hash值 index = pindex * 20。 index_copy = pindex。 // 存放 piece的 index for(i = 0。 i 20。 i++) piece_hash2[i] = pieces[index+i]。 // 比較兩個(gè) hash值,若兩者一致說(shuō)明下載了一個(gè)正確的 piece int ret = memcmp(piece_hash1,piece_hash2,20)。 if(ret != 0) { printf(piece hash is wrong\n)。 return 1。 } // 將該 piece的所有 slice寫(xiě)入文件 node_ptr = p。 slice_count = piece_length / (16*1024)。 while(slice_count 0) { write_btcache_node_to_harddisk(node_ptr)。 // 在 peer的請(qǐng)求隊(duì)列中刪除 piece請(qǐng) 求 Request_piece *req_p = peerRequest_piece_head。 Request_piece *req_q = peerRequest_piece_head。 while(req_p != NULL) { if(req_pbegin==node_ptrbegin amp。amp。 req_pindex==node_ptrindex) { if(req_p == peerRequest_piece_head) 455 項(xiàng)目實(shí)踐: BT 下載軟件的開(kāi)發(fā) 第章 13 peerRequest_piece_head = req_pnext。 else req_qnext = req_pnext。 free(req_p)。 req_p = req_q = NULL。 break。 } req_q = req_p。 req_p = req_pnext。 } node_ptrindex = 1。 node_ptrbegin = 1。 node_ptrlength = 1。 node_ptrin_use = 0。 node_ptrread_write = 1。 node_ptris_full = 0。 node_ptris_writed = 0。 node_ptraccess_count = 0。 node_ptr = node_ptrnext。 slice_count。 } // 當(dāng)前處于終端模式,則在 peer鏈表中刪除所有對(duì)該 piece 的請(qǐng)求 if(end_mode == 1) delete_request_end_mode(index_copy)。 // 更新位圖 set_bit_value(bitmap,index_copy,1)。 // 保存 piece的 index,準(zhǔn)備給所有的 peer 發(fā)送 have消息 for(i = 0。 i 64。 i++) { if(have_piece_index[i] == 1) { have_piece_index[i] = index_copy。 break。 } } // 更新 download_piece_num,每下載 10個(gè) piece就將位圖寫(xiě)入文件 download_piece_num++。 if(download_piece_num % 10 == 0) restore_bitmap()。 // 打印出提示信息 printf(%%%%%% Total piece download:%d %%%%%%\n,download_piece_num)。 printf(writed piece index:%d \n,index_copy)。 return 0。 } ? int read_piece_from_harddisk(Btcache *p, int index) 功能:從硬盤(pán)上的文件中讀取一個(gè) piece 到 p 指針?biāo)赶虻木彌_區(qū)中。函數(shù)實(shí)現(xiàn)的代碼如下: int read_piece_from_harddisk(Btcache *p, int index) { Btcache *node_ptr = p。 int begin = 0。 int length = 16*1024。 int slice_count = piece_length / (16*1024)。 int ret。 if(p==NULL || index=pieces_length/20) return 1。 while(slice_count 0) { node_ptrindex = index。 node_ptrbegin = begin。 node_ptrlength = length。 456 Linux 系統(tǒng) 下的 C 編程 ret = read_slice_from_harddisk(node_ptr)。 if(ret 0) return 1。 node_ptrin_use = 1。 node_ptrread_write = 0。 node_ptris_full = 1。 node_ptris_writed = 0。 node_ptraccess_count = 0。 begin += 16*1024。 slice_count。 node_ptr = node_ptrnext。 } return 0。 } ? int write_btcache_to_harddisk(Peer *peer) 功能:將整個(gè)緩沖區(qū)中已下載的 piece 寫(xiě)入硬盤(pán),這樣可以釋放緩沖區(qū)。函數(shù)實(shí)現(xiàn)的代碼如下: int write_btcache_to_harddisk(Peer *peer) { Btcache *p = btcache_head。 int slice_count = piece_length / (16*1024)。 int index_count = 0。 int full_count = 0。 int first_index。 while(p != NULL) { if(index_count % slice_count == 0) { full_count = 0。 first_index = index_count。 } if( (pin_use == 1) amp。amp。 (pread_write == 1) amp。amp。 (pis_full == 1) amp。amp。 (pis_writed == 0) ) { full_count++。 } if(full_count == slice_count) { write_piece_to_harddisk(first_index,peer)。 } index_count++。 p = pnext。 } return 0。 } ? int release_read_btcache_node(int base_count) 功能:當(dāng)緩沖區(qū)不夠用時(shí),釋放那些從硬盤(pán)上讀取的 piece。函數(shù)實(shí)現(xiàn)代碼如下: int release_read_btcache_node(int base_count) { Btcache *p = btcache_head。 Btcache *q = NULL。 int count = 0。 int used_count = 0。 int slice_count = piece_length / (16*1024)。 if(base_count 0) return 1。 while(p != NULL) { 457 項(xiàng)目實(shí)踐: BT 下載軟件的開(kāi)發(fā) 第章 13 if(count % slice_count == 0) { used_count = 0。 q = p。 }
點(diǎn)擊復(fù)制文檔內(nèi)容
高考資料相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1