18缓冲管理模块的设计和实现.doc

Linux系统下的C编程 Linux系统下的C编程 13项目实践:BT下载软件的开发第章 13 项目实践:BT下载软件的开发 第章 PAGE 448 PAGE 448 PAGE 459 PAGE 459 13.4.8 缓冲管理模块的设计和实现 缓冲管理模块维护一个大小为16MB的缓冲区(大小可调整),将下载到的数据先保存在缓冲区中,在达到一定的数值时再将数据写入硬盘的文件中。peer请求数据时,先在缓冲区中寻找,若缓冲区中不存在所请求的数据,则读文件并把请求数据所在的piece预先读入到缓冲区中。除了管理缓冲区,本模块还负责创建待下载的文件,把下载到的piece写入文件,在peer请求数据时读文件。本模块由data.h和data.c构成。 data.h #ifndef DATA_H #define DATA_H #include peer.h // 每个Btcache结点维护一个长度为16KB的缓冲区,该缓冲区保存一个slice的数据 typedef struct _Btcache { unsigned char *buff; // 指向缓冲区的指针 int index; // 数据所在的piece块的索引 int begin; // 数据在piece块中的起始位置 int length; // 数据的长度 unsigned char in_use; // 该缓冲区是否在使用中 unsigned char read_write; // 是发送给peer的数据还是接收到的数据 // 若数据是从硬盘读出,read_write值为0 // 若数据将要写入硬盘,read_write值为1 unsigned char is_full; // 缓冲区是否满 unsigned char is_writed; // 缓冲区中的数据是否已经写入到硬盘中 int access_count; // 对该缓冲区的访问计数 struct _Btcache *next; } Btcache; Btcache* initialize_btcache_node(); // 为Btcache结点分配内存空间并进行初始化 int create_btcache(); // 创建总大小为16K*1024即16MB的缓冲区 void release_memory_in_btcache(); // 释放data.c中动态分配的内存 int get_files_count(); // 获取种子文件中待下载的文件个数 int create_files(); // 根据种子文件中的信息创建保存下载数据的文件 // 判断一个Btcache结点中的数据要写到哪个文件以及具体位置,并写入 int write_btcache_node_to_harddisk(Btcache *node); // 从硬盘读出一个slice的数据存放到缓冲区中,在peer需要时发送给peer // 要读入的slice的索引,index、begin、length已存到node所指向的结点中 int read_slice_from_harddisk(Btcache *node); // 检查一个piece的数据是否正确,若正确则写入硬盘上的文件 int write_piece_to_harddisk(int sequence,Peer *peer); // 从硬盘上的文件中读取一个piece存放到p指针所指向的缓冲区中 int read_piece_from_harddisk(Btcache *p, int index); // 将整个缓冲区中已下载的数据写入到硬盘上的文件中 int write_btcache_to_harddisk(Peer *peer); // 当缓冲区不够用时,释放那些从硬盘上读取的piece int release_read_btcache_node(int base_count); // 从btcache缓冲区中清除那些未完成下载的piece void clear_btcache_before_peer_close(Peer *peer); // 将刚

文档评论(0)

1亿VIP精品文档

相关文档