1、引言
不知道大家在大学期间有没有有没有为各种各样的作业所烦恼过(进行给学委,班长拷贝文件、互传资料等工作)?并不是所做作业的时候(当然也有)而是在叫作业的时候,每门科目不同的作业交给不同的学习委员,发送到不同的邮箱这也是相当麻烦,到这里有没有一种方法:各科都有一个专门地点,大家向同一个地方提交相同作业,然后由学委统一收取;这样统一的操作是高效的而且是好管理;在了解到了网络传输、HTTP协议、CPP-httplib,分块传输等技术后,我尝试开发一个这样的项目,接下来分享一下这个项目。
2、项目简介
- 这个项目实现在一个局域网下进行附近文件共享下载功能的工具;
- [1]能够进行搜索匹配局域网中运行该工具的主机;并且获取到局域网在线主机列表
- [2]能够获取指定主机所共享文件信息列表(指定的共享目录下的文件信息)
- [3]能够对指定主机上的指定文件进行多线程分块下载提高效率
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库对文件的操作、多线程、分块传输等;
改进点:
断点续传: 针对下载过程中异常大致下载终止,下次继续是从上次断开处开始下载,而不是从心开始
网络穿透: 实现在不同局域网中,两台主机之间进行文件共享下载