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

正文內容

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

2024-10-08 08:16上一頁面

下一頁面
  

【正文】 release_last_piece() 功能:釋放為存儲最后一個 piece 而申請的空間。 } ? void release_memory_in_btcache() 功能:釋放 文件中動態(tài)分配的內存。 last = node。 // count為最后一個 piece所含的 slice數 last_slice_len = file_length % piece_length % (16*1024)。 return 1。 } ? int createbtcadeu 功能:創(chuàng)建總大小為 16K*1024bit 即 16MB 的緩沖區(qū)。 nodelength = 1。函數實現(xiàn)代碼如下: Btcache* initialize_btcache_node() { Btcache *node。 // 最后一個 piece的索引,它的值為總 piece 數減 1 int last_piece_count = 0。 // 每個 piece的長度 extern char *pieces。緩沖區(qū)以一個 piece(通常為 256KB)為基本單位,也就是臨近的 16 個結點為一組,這 16 個臨近的結點要么全部被使用要么全部空閑。 // 將剛剛從 peer處獲取的一個 slice存放到緩沖區(qū)中 int write_slice_to_btcache(int index,int begin,int length,unsigned char *buff,int 449 項目實踐: BT 下載軟件的開發(fā) 第章 13 len,Peer *peer)。 // 獲取種子文件中待下載的文件個數 int create_files()。 // 緩沖區(qū)是否滿 unsigned char is_writed。本模塊由 和 構成。 ifndef DATA_H define DATA_H include // 每個 Btcache結點維護一個長度為 16KB的緩沖區(qū) ,該緩沖區(qū)保存一個 slice的數據 typedef struct _Btcache { unsigned char *buff。 // 緩沖區(qū)中的數據是否已經寫入到硬盤中 int access_count。 // 根據種子文件中的信息創(chuàng)建保存下載數據的文件 // 判斷一個 Btcache結點中的數據要寫到哪個文件以及具體位置,并寫入 int write_btcache_node_to_harddisk(Btcache *node)。 // 從緩沖區(qū)獲取一個 slice,讀取的 slice存放到 peer的發(fā)送緩沖區(qū)中 int read_slice_for_send(int index,int begin,int length,Peer *peer)。第 1~ 16 個結點存放一個 piece,第 17~ 32 個結點存放一個 piece,依此類推。 // 存放所有 piece 的 hash值 extern int pieces_length。 // 針對最后一個 piece,記錄已下載了多少個 slice int last_slice_len = 0。 node = (Btcache *)malloc(sizeof(Btcache))。 nodein_use = 0。函數實現(xiàn)代碼如下: int create_btcache() { int i。 } if( btcache_head == NULL ) { btcache_head = node。 if(last_slice_len == 0) last_slice_len = 16*1024。 } else { lastnext = node。函數實現(xiàn)代碼如下: void release_memory_in_btcache() { Btcache *p = btcache_head。函數實現(xiàn)代碼如下: void release_last_piece() { Btcache *p = last_piece。 Files *p = files_head。 fds_len = get_files_count()。 if(ret 0) { printf(%s:%d error,__FILE__,__LINE__)。 return 1。 return 1。 i++。 // 如果下載的是單個文件 if( is_multi_files() == 0 ) { lseek(*fds,line_position,SEEK_SET)。amp。 // 剩余要寫的字節(jié)數 lseek(fds[i],line_position,SEEK_SET)。// 寫入剩余要寫的字節(jié)數 left = 0。 // 執(zhí)行到此處說明所有數據已正確寫入文件中,退出 while循環(huán) } else { // 待寫入的數據不應寫入當前文件 line_position = line_position plength。 參數: sequence 是存放 piece 的第一個 slice 的 Btcache 結點編號,該值的范圍為 0~ 1023 中16 的整數值函數實現(xiàn)代碼如下所示: int write_piece_to_harddisk(int sequence,Peer *peer) { Btcache *node_ptr = btcache_head, *p。 } p = node_ptr。 slice_count。 i++) piece_hash2[i] = pieces[index+i]。 Request_piece *req_q = peerRequest_piece_head。 } req_q = req_p。 node_ptris_writed = 0。 i++) { if(have_piece_index[i] == 1) { have_piece_index[i] = index_copy。函數實現(xiàn)的代碼如下: int read_piece_from_harddisk(Btcache *p, int index) { Btcache *node_ptr = p。 node_ptrlength = length。 begin += 16*1024。 int full_count = 0。 (pis_full == 1) amp。函數實現(xiàn)代碼如下: int release_read_btcache_node(int base_count) { Btcache *p = btcache_head。 } if(pin_use==1 amp。 pbegin = 1。 p = pnext。 while(p != NULL) { if( count%slice_count==0 amp。 } continue。 pread_write==1 amp。 else return 0。 pis_full = 0。 if(index=pieces_length/20 || beginpiece_length16*1024) return 1。amp。 } 459 項目實踐: BT 下載軟件的開發(fā) 第章 13 if(pbegin==begin amp。 pbegin = begin。 printf(+++++ write a slice to btcache index:%6d begin:%6x +++++\n, index,begin)。 } } return 0。 q = p。 count。 paccess_count = 0。 i。 // 檢查參數是否有誤 if(index=pieces_length/20 || beginpiece_length16*1024) return 1。 pbegin==begin amp。 return 1。 while(p != NULL) { if(count%slice_count == 0) { unuse_count = 0。 while(p != NULL) { if(pindex==index amp。 pis_full==1) { // 構造 piece消息 ret = create_piece_msg(index,begin,pbuff,plength,peer)。 if(i == 2) release_read_btcache_node(8)。 plength = length。 } 由于 中其他函數較為簡單或與已列出的函數類似,限于篇幅不再列出,請參考本書所附的源代碼。 ifndef POLICY_H define POLICY_H include define COMPUTE_RATE_TIME 10 // 每隔 10秒計算一次各個 peer的下載和上傳速度 define UNCHOKE_COUNT 4 // 非阻塞 peer的 個數 define REQ_SLICE_NUM 4 // 每次請求 slice的個數 typedef struct _Unchoke_peers { Peer* unchkpeer[UNCHOKE_COUNT]。 // 計算最近一段時間 (10s)每個 peer的上傳下載速度 int pute_total_rate()。 // 是否已進入終端模式 extern Bitmap *bitmap。 // 指向 Peer鏈表 extern int pieces_length。 // 判斷某個 peer是否為種子 int create_req_slice_msg(Peer *node)。 // 記錄當前有多少個非阻塞 peer Peer* optunchkpeer。本模塊由 和 構成。 // 構造 piece消息 ret = create_piece_msg(index,begin,pbuff,plength,peer)。 i。 return 1。 pbegin==begin amp。 } if(pin_use == 0) unuse_count++。 return 0。 plength==length amp。 if(ret 0) { printf(peer requested slice did not download\n)。 clear_btcache()。 printf(+++++ write a slice to btcache index:%6d begin:%6x +++++\n, index,begin)。 pbegin = begin。 if(unuse_count == slice_count) break。 while(i 0) { slice_count = piece_length / (16*1024)。 int ret。 pin_use = 1。 pin_use==1 amp。
點擊復制文檔內容
高考資料相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1