【项目】P2P下载帮

P2P下载帮

开发环境

  本项目开发完全在Centos7.2版本下使用C/Cpp进行开发,gcc版本5.3.1,用到的库有httplibboost,工具有gcc,gdb,makefile,git

项目介绍

功能简介

  这个下载工具可以帮助用户在局域网内搜索所有正在使用本软件的用户并且进行两台主机间的文件传输。

功能模块

  项目共分为两大功能模块,客户端服务端

服务端

  服务端模块主要负责利用HTTP协议将服务主机上的信息进行组织并且返回给客户端,达到响应客户端请求的作用,主要有以下功能:
  1、配对请求的确认功能。客户端发送配对请求给服务端时,服务端如果在线并且接收到了请求信息则会返回成功配对响应给客户端让客户端确认服务端此时在线可以发送后续请求。
  2、文件列表信息响应功能。客户端可以向服务端发送获取共享文件信息的请求,服务端此时则负责拉取共享文件夹中的文件名并且将信息组织反馈给客户端。这里利用了boost库中的接口将文件名组织进http协议的body中然后将数据返回给客户端。
  3、文件数据信息响应功能。客户端确认要下载的文件后向服务端发起下载请求,服务端此时要做的就是将目标文件内容读取进缓冲区中组织进httpbody中响应给客户端,这里同样使用boost中的接口进行实现。但在这里设计时意识到要将文件内容全部读入内存再发送,会占用大量内存,在文件极大时将会无法应付,因此这里将接口设计成根据http头中的range信息进行分块对文件读取并且组织再响应的方式配合客户端对文件数据进行分块传输。

客户端

  客户端主要负责在前端打印信息,并且在后端响应用户操作向服务端发送请求,主要有以下功能:
  1、控制台界面,利用控制台打印选项完成与用户之间的交互。
  2、主机广播配对功能。客户端必须先向局域网广播,即向所有主机发送配对请求,获取在线主机列表,才能发送后续指令。然而HTTP协议基于TCP协议因此并没有UDP协议才有的广播功能,因此这里我模拟实现了一个广播功能,即获取网络号和最大主机号,逐个向他们发送配对请求。但是串行化发送配对请求要消耗极大的时间,因此这里选择创建若干个线程并行化进行广播配对,压缩配对时间。
  3、获取服务端文件列表功能。客户端选择在线主机,并且向该主机发送获取共享文件列表的请求,服务端响应后将共享文件列表存储以供后续使用。
  4、获取服务端文件数据功能。客户端选择目标下载文件向服务端发起下载请求,并且将文件数据分块存入本地下载文件夹中。出于同样的原因,缓冲区大小受限所以选择分块传输。但是这里为了更高的效率给出两种情况,一种是并行化下载,一种是串行化下载。当文件小于2G时,内存完全足够申请缓冲区,为了更快的速度选择并行化下载;当文件大于2G时,硬件受限所以进行串行化下载,虽然速度有所下降,但是可以减少内存占用。

项目中遇到的问题

大文件下载

  httplib库将文件所有数据读入内存中再进行响应,因此大文件受限于内存会无法进行传输,这里选择进行分块下载,并且为了提高下载效率采取小文件并行下载,大文件串行下载来解决问题。

TCP局域网广播

  TCP协议并没有提供广播功能,因此我只能模拟实现广播功能完成广播配对。这里利用系统接口获取本机所有网卡的ip地址及子网掩码,ip地址与子网掩码想与得到网络号,子网掩码取反得到最大主机号,由此获得局域网内所有主机的ip地址,并且向其逐个发送配对请求来完成广播配对。

创建多参数入口函数的线程

  在客户端利用线程分块向服务端发送获取文件数据的请求时,需要向线程入口函数传入多个参数,但是Cpp库中以及系统函数都无法传入多个参数,在晚上查阅资料、文档并且通过个人实验下发现boost库中的线程函数是可以传入多个参数的,因此选择使用boost库中的线程函数。

客户端文件写入函数

  客户端需要在线程中多次打开下载文件。我最初选择使用Cpp中的文件函数打开文件并且写入文件,但是发现每个线程打开文件都会将文件中之前的数据进行清空,根本无法分块写入。在查阅文档后决定改用系统调用函数来完成文件分块写入,在参数中只要不加入截断文件的参数即可累积写入。

项目效果预览

  使用界面。
P2P

  搜索主机(为了方便演示,这里更改只搜索了本机主机)

P2P

  选择主机。

P2P

  选择下载文件。

P2P

  下载成功。

P2P

  4G大文件下载。

P2P

P2P

P2P

  经验证,文件md5值一致。

项目扩展方向

  目前项目仅支持局域网内的文件传输,但是项目可以扩展为可以在外网进行P2P文件传输的工具,这里需要用到内网穿透技术。
  项目还可以在用户服务上进行进一步改进,比如可以计入文件预览,视频文件在线点播等功能。

项目发布

  GitHub:https://github.com/MisakiFx/P2PDownload

-------------本文结束感谢您的阅读!-------------
记录学习每一分,感谢您的赞助