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

正文內(nèi)容

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

2024-09-22 08:16 上一頁面

下一頁面
  

【正文】 // 指向己方的位 圖 extern Peer *peer_head。 // 計算總的上傳下載速度 int is_seed(Peer *node)。 // 保存非阻塞 peer的指針 int count。 462 Linux 系統(tǒng) 下的 C 編程 策略管理模塊的設(shè)計和實現(xiàn) 策略管理模塊負(fù)責(zé)策略的實現(xiàn),主要是計算各個 peer 的下載和上傳速度,根據(jù)下載速度選擇非阻塞 peer,采用隨機(jī)算法選擇優(yōu)化非阻塞 peer,以及實現(xiàn)片斷選擇策略。 read_slice_from_harddisk(p)。 if(i == 1) release_read_btcache_node(0)。 if(ret 0) { printf(Function create piece msg error\n)。amp。 q = p。 } paccess_count = 1。amp。 ret = get_bit_value(bitmap,index)。 } // 如果還沒有空閑的緩沖區(qū) ,丟棄下載到的這個 slice printf(+++++ write a slice to btcache FAILED :NO BUFFER +++++\n)。 memcpy(pbuff,buff,len)。 } pindex = index。 } if(pin_use == 0) unuse_count++。 } // p為空說明當(dāng)前 slice是其所在的 piece第一塊下載到的數(shù)據(jù) // 首先判斷是否存在空 的緩沖區(qū) ,若不存在 ,則將已下載的寫入硬盤 int i = 4。 // 如果是剛剛開始下載 (下載到的 piece不足 10 個 ),則立即寫入硬盤并告知 peer if(download_piece_num 10) { int sequence。 plength = length。amp。 pin_use==1) break。 if(buff==NULL || peer==NULL) return 1。 pis_writed = 0。 } ? void clear_btcache() 功能:將整個緩沖區(qū)中所存的所有數(shù)據(jù)清空。amp。 } if( count%slice_count!=0 || pread_write!=1 || pis_full!=1) break。amp。 } } return 0。 plength = 1。amp。 Btcache *q = NULL。amp。 int first_index。 slice_count。 456 Linux 系統(tǒng) 下的 C 編程 ret = read_slice_from_harddisk(node_ptr)。 int begin = 0。 break。 node_ptraccess_count = 0。 req_p = req_pnext。 while(req_p != NULL) { if(req_pbegin==node_ptrbegin amp。 // 比較兩個 hash值,若兩者一致說明下載了一個正確的 piece int ret = memcmp(piece_hash1,piece_hash2,20)。 node_ptr = node_ptrnext。 // p指針指向 piece的第一個 slice所在的 btcache結(jié)點 // 計算剛剛下載到的這個 piece的 hash 值 SHA1_CTX ctx。 unsigned char piece_hash1[20], piece_hash2[20]。 i++。 } else { // 當(dāng)前文件的長度小于要寫的字節(jié)數(shù) lseek(fds[i],0,SEEK_SET)。 write(fds[i],nodebuff,plength line_position)。 (line_position+nodelength plength)) { // 如果待寫入的數(shù)據(jù) (即一個長度為 16KB 的 slice)屬于同一個文件 lseek(fds[i],line_position,SEEK_SET)。 write(*fds,nodebuff,nodelength)。 } //while的循環(huán)結(jié)束 } //end else return 0。 } ret = lseek(fds[i],plength1,SEEK_SET)。 } ret = chdir(file_name)。 return 1。 if(fds_len 0) return 1。 while(p != NULL) { count++。 while(p != NULL) { last_piece = pnext。 while(p != NULL) { btcache_head = pnext。 last = node。 last_piece_index = pieces_length / 20 1。 last = node。 Btcache *node, *last。 noderead_write = 1。 if(node == NULL) { return NULL。 // 最后一個 piece的最后一個 slice的長度 int *fds = NULL。 // 緩沖區(qū) pieces的長度 extern Bitmap *bitmap。為了方便處理,所有緩沖區(qū)在程序啟動時統(tǒng)一申請,在程序結(jié)束時一起被釋放。 // 以下是為下載和上傳最后一個 piece而增加的函數(shù) // 最后一個 piece較為特殊 ,因為它是一個不完整的 piece int write_last_piece_to_btcache(Peer *peer)。 // 從硬盤讀出一個 slice的數(shù)據(jù)存放到緩沖區(qū)中 ,在 peer需要時發(fā)送給 peer // 要讀入的 slice的索引, index、 begin、 length已存到 node所指向的結(jié)點中 int read_slice_from_harddisk(Btcache *node)。 // 對該緩沖區(qū)的訪問計數(shù) struct _Btcache *next。 // 指向緩沖區(qū)的指針 int index。除了管理緩沖區(qū),本模塊還負(fù)責(zé)創(chuàng)建待下載的文件,把下載到的 piece 寫入文件,在 peer 請求數(shù)據(jù)時讀文件。 // 是發(fā)送給 peer的數(shù)據(jù)還是接收到的數(shù)據(jù) // 若數(shù)據(jù)是從硬盤讀出 ,read_write值為 0 // 若數(shù)據(jù)將要寫 入硬盤 ,read_write值為 1 unsigned char is_full。 // 釋放 int get_files_count()。 // 從 btcache緩沖區(qū)中清除那些未完成下載的 piece void clear_btcache_before_peer_close(Peer *peer)。 endif 每個緩沖區(qū)結(jié)點的大小為 16KB,默認(rèn)生成 1024 個結(jié)點,總大小為 16MB。 // 待下載文件的總長度 extern int piece_length。 // 存放待下載文件的最后一個 piece int last_piece_index = 0。 ? Btcache* initialize_btcache_node() 功能:創(chuàng)建 Btcache 結(jié)點,分配內(nèi)存空間并對其成員的值進(jìn)行初始化。 nodebegin = 1。 return node。 release_memory_in_btcache()。 last_piece_count = count。 451 項目實踐: BT 下載軟件的開發(fā) 第章 13 } if(last_piece == NULL) { last_piece = node。 } return 0。 if(fds != NULL) free(fds)。函數(shù)實現(xiàn)代碼如下: int get_files_count() { int count = 0。函數(shù)實現(xiàn)代碼如下: int create_files() { int ret, i。 return 1。 if(ret 0) { // 改變目錄失敗,說明該目錄還未創(chuàng)建 ret = mkdir(file_name,0777)。 while(p != NULL) { fds[i] = open(ppath,O_RDWR|O_CREAT,0777)。 return 1。 if((node == NULL) || (fds == NULL)) return 1。 i = 0。 (line_position+nodelength = plength) ) { // 如果待寫入的數(shù)據(jù)跨越了兩個或兩個以上的文件 int offset = 0。 // 獲取下一個文件描述符 while(left 0) { if(plength = left) { // 當(dāng) 前文件的長度大于等于要寫的字節(jié)數(shù) lseek(fds[i],0,SEEK_SET)。 p = pnext。 具體代碼請參考本書所附源代碼。 while(i sequence) { node_ptr = node_ptrnext。 node_ptr!=NULL) { SHA1Update(amp。 // 存放 piece的 index for(i = 0。 while(slice_count 0) { write_btcache_node_to_harddisk(node_ptr)。 req_p = req_q = NULL。 node_ptrread_write = 1。 // 保存 piece的 index,準(zhǔn)備給所有的 peer 發(fā)送 have消息 for(i = 0。 return 0。 while(slice_count 0) { node_ptrindex = index。 node_ptris_writed = 0。 int slice_count = piece_length / (16*1024)。 (pread_write == 1) amp。 } return 0。 while(p != NULL) { 457 項目實踐: BT 下載軟件的開發(fā) 第章 13 if(count % sli
點擊復(fù)制文檔內(nèi)容
高考資料相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1