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

正文內容

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

2024-09-06 08:16 本頁面
 

【正文】 448 Linux 系統(tǒng) 下的 C 編程 緩沖管理模塊的設計和實現(xiàn) 緩沖管理模塊維護一個大小為 16MB 的緩沖區(qū)(大小可調整),將下載到的數(shù)據(jù)先保存在緩沖區(qū)中,在達到一定的數(shù)值時再將數(shù)據(jù)寫入硬盤的文件中。 peer 請求數(shù)據(jù)時,先在緩沖區(qū)中尋找,若緩沖區(qū)中不存在所請求的數(shù)據(jù),則讀文件并把請求數(shù)據(jù)所在的 piece 預先讀入到緩沖區(qū)中。除了管理緩沖區(qū),本模塊還負責創(chuàng)建待下載的文件,把下載到的 piece 寫入文件,在 peer 請求數(shù)據(jù)時讀文件。本模塊由 和 構成。 ifndef DATA_H define DATA_H include // 每個 Btcache結點維護一個長度為 16KB的緩沖區(qū) ,該緩沖區(qū)保存一個 slice的數(shù)據(jù) typedef struct _Btcache { unsigned char *buff。 // 指向緩沖區(qū)的指針 int index。 // 數(shù)據(jù)所在的 piece塊的索引 int begin。 // 數(shù)據(jù)在 piece塊中的起始位置 int length。 // 數(shù)據(jù)的長度 unsigned char in_use。 // 該緩沖區(qū)是否在使用中 unsigned char read_write。 // 是發(fā)送給 peer的數(shù)據(jù)還是接收到的數(shù)據(jù) // 若數(shù)據(jù)是從硬盤讀出 ,read_write值為 0 // 若數(shù)據(jù)將要寫 入硬盤 ,read_write值為 1 unsigned char is_full。 // 緩沖區(qū)是否滿 unsigned char is_writed。 // 緩沖區(qū)中的數(shù)據(jù)是否已經寫入到硬盤中 int access_count。 // 對該緩沖區(qū)的訪問計數(shù) struct _Btcache *next。 } Btcache。 Btcache* initialize_btcache_node()。 // 為 Btcache結點 分配內存空間并進行初始化 int create_btcache()。 // 創(chuàng)建總大小為 16K*1024即 16MB的緩沖區(qū) void release_memory_in_btcache()。 // 釋放 int get_files_count()。 // 獲取種子文件中待下載的文件個數(shù) int create_files()。 // 根據(jù)種子文件中的信息創(chuàng)建保存下載數(shù)據(jù)的文件 // 判斷一個 Btcache結點中的數(shù)據(jù)要寫到哪個文件以及具體位置,并寫入 int write_btcache_node_to_harddisk(Btcache *node)。 // 從硬盤讀出一個 slice的數(shù)據(jù)存放到緩沖區(qū)中 ,在 peer需要時發(fā)送給 peer // 要讀入的 slice的索引, index、 begin、 length已存到 node所指向的結點中 int read_slice_from_harddisk(Btcache *node)。 // 檢查一個 piece的數(shù)據(jù)是否正確 ,若正確則寫入硬盤上的文件 int write_piece_to_harddisk(int sequence,Peer *peer)。 // 從硬盤上的文件中讀取一個 piece存放到 p指針所指向的緩沖區(qū)中 int read_piece_from_harddisk(Btcache *p, int index)。 // 將整個緩沖區(qū)中已下載的數(shù)據(jù)寫入到硬盤上的文件中 int write_btcache_to_harddisk(Peer *peer)。 // 當緩沖區(qū)不夠用時 ,釋放那些從硬盤上讀取的 piece int release_read_btcache_node(int base_count)。 // 從 btcache緩沖區(qū)中清除那些未完成下載的 piece void clear_btcache_before_peer_close(Peer *peer)。 // 將剛剛從 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)。 // 從緩沖區(qū)獲取一個 slice,讀取的 slice存放到 peer的發(fā)送緩沖區(qū)中 int read_slice_for_send(int index,int begin,int length,Peer *peer)。 // 以下是為下載和上傳最后一個 piece而增加的函數(shù) // 最后一個 piece較為特殊 ,因為它是一個不完整的 piece int write_last_piece_to_btcache(Peer *peer)。 int write_slice_to_last_piece(int index,int begin,int length,unsigned char *buff,int len,Peer *peer)。 int read_last_piece_from_harddisk(Btcache *p, int index)。 int read_slice_for_send_last_piece(int index,int begin,int length,Peer *peer)。 void release_last_piece()。 endif 每個緩沖區(qū)結點的大小為 16KB,默認生成 1024 個結點,總大小為 16MB。緩沖區(qū)以一個 piece(通常為 256KB)為基本單位,也就是臨近的 16 個結點為一組,這 16 個臨近的結點要么全部被使用要么全部空閑。第 1~ 16 個結點存放一個 piece,第 17~ 32 個結點存放一個 piece,依此類推。為了方便處理,所有緩沖區(qū)在程序啟動時統(tǒng)一申請,在程序結束時一起被釋放。 以下是 文件的頭部包含的代碼,主要包含一些頭文件和定義了一些全局變量。 include include include include include sys/ include sys/ include include include include include include include extern char *file_name。 // 待下載文件的文件名 extern Files *files_head。 // 對于多文件種子有效,存放各個文件的路徑和長度 extern int file_length。 // 待下載文件的總長度 extern int piece_length。 // 每個 piece的長度 extern char *pieces。 // 存放所有 piece 的 hash值 extern int pieces_length。 // 緩沖區(qū) pieces的長度 extern Bitmap *bitmap。 // 指向己方的位圖 extern int download_piece_num。 // 記錄已經下載了多少個 piece extern Peer *peer_head。 // 指向 peer鏈表 define btcache_len 1024 // 緩沖區(qū)中共有多少個 Btcache結點 Btcache *btcache_head = NULL。 // 指向一個大小為 16MB的緩沖區(qū) Btcache *last_piece = NULL。 // 存放待下載文件的最后一個 piece int last_piece_index = 0。 // 最后一個 piece的索引,它的值為總 piece 數(shù)減 1 int last_piece_count = 0。 // 針對最后一個 piece,記錄已下載了多少個 slice int last_slice_len = 0。 // 最后一個 piece的最后一個 slice的長度 int *fds = NULL。 // 存放文件描述符 int fds_len = 0。 // 指針 fds所指向的數(shù)組的長度 int have_piece_index[64]。 // 存放剛剛下載到的 piece的索引 int end_mode = 0。 // 是否進入了終端模式,終端模式的含義參考 BT協(xié)議 450 Linux 系統(tǒng) 下的 C 編程 中各個函數(shù)的定義如下。 ? Btcache* initialize_btcache_node() 功能:創(chuàng)建 Btcache 結點,分配內存空間并對其成員的值進行初始化。函數(shù)實現(xiàn)代碼如下: Btcache* initialize_btcache_node() { Btcache *node。 node = (Btcache *)malloc(sizeof(Btcache))。 if(node == NULL) { return NULL。 } nodebuff = (unsigned char *)malloc(16*1024)。 if(nodebuff == NULL) { if(node != NULL) free(node)。 return NULL。 } nodeindex = 1。 nodebegin = 1。 nodelength = 1。 nodein_use = 0。 noderead_write = 1。 nodeis_full = 0。 nodeis_writed = 0。 nodeaccess_count= 0。 nodenext = NULL。 return node。 } ? int createbtcadeu 功能:創(chuàng)建總大小為 16K*1024bit 即 16MB 的緩沖區(qū)。函數(shù)實現(xiàn)代碼如下: int create_btcache() { int i。 Btcache *node, *last。 // node指向剛剛創(chuàng)建的結點、 last指向緩沖區(qū)中最后一個結點 for(i = 0。 i btcache_len。 i++) { node = initialize_btcache_node()。 if( node == NULL ) { printf(%s:%d create_btcache error\n,__FILE__,__LINE__)。 release_memory_in_btcache()。 return 1。 } if( btcache_head == NULL ) { btcache_head = node。 last = node。 } else { lastnext = node。 last = node。 } } // 為存儲最后一個 piece申請空間 int count = file_length % piece_length / (16*1024)。 if(file_length % piece_length % (16*1024) != 0) count++。 last_piece_count = count。 // count為最后一個 piece所含的 slice數(shù) last_slice_len = file_length % piece_length % (16*1024)。 if(last_slice_len == 0) last_slice_len = 16*1024。 last_piece_index = pieces_length / 20 1。 // 最后一個 piece的 index值 while(count 0) { node
點擊復制文檔內容
高考資料相關推薦
文庫吧 www.dybbs8.com
公安備案圖鄂ICP備17016276號-1