用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,这些信号的默认动作是立即终止程序,但之前需做一些处理,比如释放动态申请的内存、关闭文件描述符、关闭套接字等。
种子解析:负责解析种子文件,从中获取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,这些信号的默认动作是立即终止程序,但之前需做一些处理,比如释放动态申请的内存、关闭文件描述符、关闭套接字等。
相关文章推荐
- 用C语言开发一个BT下载软件 (二) ------ 算法和策略
- 用C语言开发一个BT下载软件 (四) ------ 代码实现-3-出错处理模块和运行日志模块
- 用C语言开发一个BT下载软件 (四) ------ 代码实现-2-位图管理模块的代码实现
- 用C语言开发一个BT下载软件 (四) ------ 代码实现-1-种子文件解析模块
- 用C语言开发一个BT下载软件 (四) ------ 代码实现-4-信号处理模块
- 用C语言开发一个BT下载软件(一) ------ BitTorrent协议 -2
- 用C语言开发一个BT下载软件 (四) ------ 代码实现-5-Peer管理模块
- 用C语言开发一个BT下载软件(一) ------ BitTorrent协议 -1
- 从零开始打造一个新闻订阅APP之服务器篇(一、系统结构设计&开发流程简介)
- BT下载软件开发笔记——种子解析模块的设计与实现
- 软件系统开发中的组件框架技术研究、设计和应用
- 一个WEB系统的界面设计和开发 —— 一个经验级人物的文章
- 软件系统开发中的组件框架技术研究、设计和应用【转自lrn资源网】
- 一个Web系统OA界面设计和开发
- web开发,是个非常敏捷的过程,变化随时都在产生,用户需求千变万化,许多方面偶然性非常高,较之软件开发,希望用一个架构规划以后的所有设计,是不现实的
- 一个Web系统的界面设计和开发.1
- 如何组建和管理一个嵌入式系统软件开发团队
- 用Java设计下载软件-Java基础-Java-编程开发
- 软件系统开发中的组件框架技术研究、设计和应用[转]
- Tangram:一个基于MFC框架的柔性软件开发系统