P2P共享下载器

1、引言

不知道大家在大学期间有没有有没有为各种各样的作业所烦恼过(进行给学委,班长拷贝文件、互传资料等工作)?并不是所做作业的时候(当然也有)而是在叫作业的时候,每门科目不同的作业交给不同的学习委员,发送到不同的邮箱这也是相当麻烦,到这里有没有一种方法:各科都有一个专门地点,大家向同一个地方提交相同作业,然后由学委统一收取;这样统一的操作是高效的而且是好管理;在了解到了网络传输、HTTP协议、CPP-httplib,分块传输等技术后,我尝试开发一个这样的项目,接下来分享一下这个项目。

2、项目简介
  • 这个项目实现在一个局域网下进行附近文件共享下载功能的工具
  • [1]能够进行搜索匹配局域网中运行该工具的主机;并且获取到局域网在线主机列表
  • [2]能够获取指定主机所共享文件信息列表(指定的共享目录下的文件信息)
  • [3]能够对指定主机上的指定文件进行多线程分块下载提高效率
3、整体框架介绍

项目主要分为两大模块:客户端模块/服务端模块
客户端模块:

  1. 查看局域网中有哪些共享主机 – 向网络中广播配对请求,得到响应
  2. 获取指定主机的共享文件信息列表 – 向指定主机发送获取列表请求
  3. 从指定主机上面下载文件 --想指定主机发送下载指定文件请求

服务端模块:

  • 针对客户端所发起多种的请求,提供相应的服务

框架图:
在这里插入图片描述
在这里插入图片描述

4、客户端设计
  • 获取网卡信息–获取主机IP + MASK–局域网IP列表
  • 向所有IP发送配对请求 — 得到在线主机列表(将在线主机的IP打印到终端)
  • 选择一个主机(IP)发送获取该主机的文件列表请求–获取到共享的文件列表(将文件列表打印到终端)
  • 从这个主机下载指定的共享文件(创建文件,打开文件,将响应数据写入文件。关闭文件)
5、服务端设计
  • 接收到主机请求配对,做出200响应

  • 接收到文件列表请求
    1.检测获取指定共享目录下文件信息(文件名)
    2.将所有文件名组织成HTTP响应正文

  • 接受到指定文件下载请求
    1.通过文件名检测文件是否存在
    2.检测文件是否是一个普通文件
    3.打开文件,读取文件数据作为HTTP响应正文响应发送

6、接口设计

客户端:
提供客户端主机配对功能

void HostPair(const uint32_t ip);//直接向主机发送请求,判断是否在线---这是一个线程入口函数
bool GetOnlineHost(){1.获取网卡信息--获取主机IP,2.创建线程,传入HostPair,判断是否在线}

提供获取指定主机共享文件列表功能

bool GetShareList(const uint32_t ip);//获取指定主机的共享文件列表,打印在终端

提供下载指定主机上共享文件的文件功能

bool DownLoadFile(const uint32_t ip,const std::string &filename);

服务端:
提供响应主机配对请求功能

void HostPair();//针对客户端主机配对请求做出响应

提供响应获取共享文件列表功能

void ShareList();//针对客户端共享文件列表做出响应---(获取目录下文件信息)

提供响应下载请求功能

v**加粗样式**oid DownLoad();//针对客户端下载请求做出响应---(打开文件读数据响应给客户端)

其他接口:
windows下获取网卡信息功能

static bool  GetAllAdapter(std::vector<Adapter> *list)

cpp-httplib搭建http服务器

httplib::Client cli(buf, P2P_PORT); //实例化httplib客户端对象
httplib::Server _srv;//实例化httplib服务端
7、项目技术点即改进点

技术点: 使用cpp-httplib搭建http服务器、boost库对文件的操作、多线程、分块传输等;
改进点:
断点续传: 针对下载过程中异常大致下载终止,下次继续是从上次断开处开始下载,而不是从心开始
网络穿透: 实现在不同局域网中,两台主机之间进行文件共享下载

8、源码

Github:https://github.com/IronChang/P2P-Shared-download

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值