一个简单的BitTorrent客户端实现(一):概述

前言

从读大学开始,C++就一直陪伴着我。这么多年了,总得留下些痕迹。而我一直钟爱socket编程,看了别人写的代码,再加上自己的摸索,就用C++做了最一个简单的bittorrent客户端。还望各位大神多多赐教。

开发环境

以Ubuntu 14.04.3 i386为操作系统,Eclipse cdt 4.5.1为开发工具,gcc 4.8.4为编译器。另外,还需要安装curl-7.46.0.tar.bz2,测试用的torrent文件是ubuntu-14.04.3-desktop-i386.iso.torrent。

功能介绍

程序目前实现了以下功能:
(1)解析种子文件。
(2)与各个peer进行数据的上传下载,choke和unchoke算法,轮询tracker,检查与peer的连接状况等等。
(3)保存下载的piece到磁盘。
(4)保存下载的位图。
(5)显示当前下载和上传速度,下载完成进度。
该程序没有实现做种和限速下载上传的功能。性能也不是很好,若以后有时间的话,我会继续完善。

程序的逻辑和流程

BT的原理大家可以参考下面的三个网站,我在这里就不介绍了。
BT官方网站上的协议解释:http://www.bittorrent.org/protocol.html
Bittorrent Protocol Specification:http://wiki.theory.org/BitTorrentSpecification
Incentives Build Robustness in BitTorrent:http://www.bittorrent.com/bittorrentecon.pdf
程序的流程:
(1)解析种子文件。
(2)生成peerID。
(3)创建同步事件分离器,这里我用的是select,当然也可以用poll或者epoll。
(4)创建磁盘缓冲区,用于暂存下载的piece。
(5)创建trackermanager,用于管理tracker,因为可能有多个tracker。
(6)创建peermanager,用于管理peer。
(7)创建peeracceptor,监听端口,作为服务器端,用于接收peer的连接。
(8)trackermanager创建tracker,连接tracker服务器,获取peer列表,并添加到peermanager中。
(9)peermanager中,本地客户端与各peer进行交互,发送消息,上传下载piece,保存接收到的数据。
(10)同步事件分离器不停地select套接字,分发套接字的读写事件和定时器事件到指定的处理器。

程序的结构及类设计

程序的结构如下:
基本模块图
程序在设计上采用的是reactor模式,有点像ACE。同步事件分离器分离套接字读写事件和定时器事件到指定的事件处理器。主要类的说明:
CTorrentTask:torrent任务类,最最核心的类,程序的入口,整个程序中就一个CTorrentTask类的实例,里面保存了CPeerManager,CTorrentFile,CTrackerManager等类的指针,同时这些类成员中也维护一个该类的指针。
CTorrentFile:用于保存torrent文件的信息。
CSelectReactor:同步事件分离器,分离套接字读写事件和timer事件。
CRateMeasure:用于计算各个peer上传下载的速度。
CPeerAcceptor:用于接收远程peer的连接,并创建套接字与之通信。
CPeerManager:用于管理peer,提供定时器事件处理器阻塞或者解阻塞peer,检查peer的连接情况。
CTrackerManager:用于管理tracker。
CTaskStorage:磁盘缓冲管理,读写数据到磁盘。
CBitSet:用于记录下载完成情况。
CTCPTracker:用于轮询tracker,获取peer列表。
CPeerLink:作为客户端与远程peer进行通信。
CPieceRequest:维护一个piece请求列表,包括offset,请求长度,数据内容。

程序运行效果图

这里写图片描述
程序源代码下载地址:http://download.csdn.net/detail/zxywd/9415711

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值