【實戰項目】---P2P下載器

1.引言

在校期間經常需要進行給學委,班長拷貝文件、互傳資料等工作,如果拋開一些聊天工具,如何進行彼此在線主機文件共享呢?帶着種種困惑,瞭解網絡傳輸以及Socket套接字編程、HTTP協議格式、CPP-httplib、分塊傳輸機制等相關技術之後,開始慢慢摸索,不斷試錯,於是乎有了這個項目。

2.項目簡介

環境:Windows10 VS2013 C/C++

  • 該項目完成了一個在局域網中進行附近文件共享下載功能的工具
  1. 能夠進行搜索匹配局域網中運行工具的主機;獲取到局域網在線主機列表;
  2. 能夠獲取指定主機所共享的文件信息列表(指定的共享目錄下的文件信息);
  3. 能夠對指定主機上的指定文件進行多進程分塊下載來提高傳輸效率。

3.整體框架

在這裏插入圖片描述
在這裏插入圖片描述

4.服務端設計

服務器端設計:

功能:設計實現HTTP服務端程序,能夠提供瀏覽器客戶端進行文件的下載,獲取文件列表

服務端流程

①.搭建HTTP服務器

  • 1.主機配對請求處理功能
  • 2.主機文件列表獲取處理功能
  • 3.主機獲取數據獲取功能

②.提供附近主機配對功能

③.向附近主機提供文件列表

④.向附近主機提供文件下載功能

5.客戶端設計

功能:實現基於服務器HTTP的分塊傳輸功能實現多進程文件分塊下載功能的下載器,通過分塊傳輸提高傳輸效率

客戶端流程

  • 1.發現局域網附近共享用戶,獲取局域網中所有的IP地址信息
  • 2.向獲取到的IP主機地址發送主機配對請求–獲取到配對成功的主機IP地址列表,打印配對成功的主機列表
  • 3.用戶選擇想要獲取哪兒個主機的共享文件
  • 4.向指定的這個主機發送文件列表獲取請求 – 獲取到主機上的共享文件列表
  • 5.打印所有的文件列表,獲取文件頭部信息,主要獲取文件長度,向指定的主機發送文件數據獲取請求
  • 6.若文件過大,則創建多線程進行分塊傳輸下載。

6.主要功能端口

客戶端

  1. 提供客戶端的主機配對功能
bool GetonlineHost()
  1. 提供客戶端的文件列表獲取功能
bool GetShareList(const std::string &host_ip)
  1. 提供客戶端的文件下載功能(普通下載&&分塊傳輸下載)
//普通下載
bool DownloadFile(const std::string &host_ip, const std::string& filename)
//分塊傳輸下載
bool RangeDownload(const std::string &host_ip, const std::string &filename)

服務端

  1. 提供能夠發現匹配局域網附近主機功能
static void HostPair(const httplib::Request &req, httplib::Response &rsp)
  1. 提供能夠獲取指定主機共享文件列表功能
	//獲取共享文件列表,在主機上設置一個共享目錄,凡是這個目錄下的文件都是要給別人共享的
	static void ShareList(const httplib::Request &req, httplib::Response &rsp)
  1. 提供能夠下載指定主機下指定的共享文件功能
static void Download(const httplib::Request &req, httplib::Response &rsp)

其他接口

httplib基本使用
1.實例化客戶端對象

httplib::Client cli(buf, P2P_PORT); //實例化httplib客戶端對象

2.實例化服務端對象

httplib::Server _srv;

Windows下獲取網卡信息

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

7.httplib的處理流程:

搭建客戶端
1.組織HTTP協議格式請求數據
2.搭建TCP客戶端
3.發送組織好的HTTP請求數據
4.等待服務端響應,接收服務端數據
5.對響應數據進行解析

搭建服務端
1.搭建一個最簡單的TCP服務器
2.等待接收客戶端發送的數據
3.按照HTTP協議格式,對數據進行解析(請求方法按URL協議版本進行)
4.根據請求的資源路徑以及查詢字符串正文,進行業務描述
5.組織HTTP協議格式的響應,返回給客戶端(協議版本 狀態碼 描述)

8.源碼

點擊查看源碼(https://github.com/SJRLL/gongxiangxiazaiqi)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章