您的位置:首页 > 编程语言 > C语言/C++

用C语言开发一个BT下载软件 (三) ------ 系统结构设计

2017-12-24 05:55 573 查看
      整个系统各个模块功能如下图所示:



种子解析:负责解析种子文件,从中获取Tracker服务器的地址,待下载文件的文件名和长度,piece长度,各个piece的hash值。
连接Tracker:根据HTTP协议构造获取peer地址的请求,与Tracker建立连接,解析Tracker的回应消息,从而获取各个peer的IP地址和端口号。
与peer交换数据:根据peer的IP地址和端口号连接peer,从peer出下载数据并将已下载的数据上传给peer。
出错处理:定义整个系统可能出现的错误类型,并进行处理。
运行日志:记录程序运行的日志,保存到文件中以备查看和分析。

      上述第3项“与peer交换数据”是本系统的核心和主要构成部分,它又可以划分成如下几个子模块:
      (1)peer管理:本模块为每个建立TCP连接的Peer构造一个peer结构体,并负责管理peer链表,添加和删除peer节点。
                  peer结构体的主要成员有:

peer的IP地址和端口号
与该peer进行通信的套接字
该peer的ID
该peer当前所处状态
发送缓冲区
接收缓冲区
数据请求队列
数据被请求队列
从该peer处已下载的数据量
向该peer上传的数据量
下载速度和上传速度

      (2)消息处理:peer之间通过发送和接收消息的方式进行通信。本模块负责根据当前的状态生成并发送消息,接收并处理消息。对下载和上传最重要的是request消息和piece消息。request消息向peer发送数据请求,指明请求的是哪个piece的哪个slice。peer接收到request消息后根据当前状态,决定是否发送数据给对方。如果允许发送,则构造piece消息,数据被封装在该消息中。每当下载完一个正确的piece时,就向所有peer发送have消息通知已或得该piece,其他peer如果没有该piece就可以向peer发送数据请求。

      (3)缓冲管理:如果下载完一个piece就立即写入硬盘,会导致频繁地读写硬盘。下载的数据将被缓存起来,等到一定量后再集中写入硬盘。当peer请求一个slice时,也是先将该slice所在的整个piece读入到缓冲区中,下次peer再请求该piece的其他slice时,则只需在缓冲区中获取,避免频繁读写硬盘。

      (4)位图管理:位图标明哪些piece已经下载,哪些piece还没有下载。每个piece占1位,分别用1和0表示已下载和未下载。客户端与peer建立连接并进行握手之后,即发送位图给peer,同时也接收对方的位图并将其保存在peer结构体中。每下载到一个piece就更新自己的位图,并发送have消息给所有已建立连接的peer。每当接收到peer发来的have消息就更新该peer的位图。

      (5)策略管理:计算各个peer的下载和上传速度,根据下载速度选择非阻塞peer,采用随机算法选择优化非阻塞peer,以及实现片断选择策略。

      (6)信号处理:在运行过程中,程序可能会接收到一些信号,如SIGINT,SIGTERM,这些信号的默认动作是立即终止程序,但之前需做一些处理,比如释放动态申请的内存、关闭文件描述符、关闭套接字等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐